Python2:在子流程中暂停或使用yield,然后从另一个流程中获取价值

如何解决Python2:在子流程中暂停或使用yield,然后从另一个流程中获取价值

我正在使用python3(下面的main.py在python3中运行)编写程序,并利用现有的python扩展名(用c编写,使用python2编译),但我没有源代码。可以说FrozenModule类来自此扩展。它确实做了很多事情,但是在这里只是试图简化它。基本上,我可以订阅事件,实际上我可以控制回调函数。这意味着我最有能力通过更新回调函数来更改流。

问题是我必须重新组织流程,并且想在每次调用回调函数时冻结/暂停。

我想要的最终结果是:

1:a,i,x
5:b,j,y
8:c,k,z

下面是我目前在这里得到的代码。但是它并不是按照我想要的方式工作。我添加了set_trace只是为了检查流程。我获得正确输出的原因是因为我已经在SELECTEDfunc2.py中定义了func3.py值。实际上,我希望它来自func1.py

简而言之,我真的很想先运行func1.py,从中获取特定的键,然后运行func2.py,这基本上会遍历它拥有的数据,直到它击中该事件/键,然后执行回调。暂停,并对func3.py执行相同的操作,然后也暂停。然后回到func1.py,然后重新做一遍。

当前工作方式(不是下面的代码,而是我正在重写的当前程序),它先运行整个func1.py,然后所有键都已知,然后传递给{{1} }和func2.py,然后分别获得值。最后,将其全部附加在一起以生成整个表,如下所示:

func3.py

主要问题是这些工作确实很大,可能需要很长时间。这也可能会在中间崩溃,您不会在其中得到任何回报。因此,新方法是逐行或逐行生成最终输出。而不是逐列执行列,而是合并所有内容并将整个结果提供给用户。

以下代码的问题是,当我运行子流程时(我之所以使用子流程是因为扩展名仅需要在python2中使用),它实际上可以立即在整个数据中运行/迭代。我添加了写入文件的目的只是为了确保这种情况的发生。因此,只要您运行1:a,z ,甚至不需按main.py来继续set_trace,'c'就已经拥有:

f2.txt

最初应该真正为空的地方,然后当我在main中按下1,i 5,j 8,k 时,它应该只写1行,暂停并等待下一行。当然,set_trace和写入文件也可以进行测试。

简而言之,主要目标是逐行写入输出。还有两个主要问题:1)每次调用回调时如何暂停子进程。 2)将从'c'获得的值传递给func1.pyfunc2.py,然后继续/取消暂停该过程。

很抱歉,冗长的帖子。另外,我希望我的问题清楚。

示例代码如下:

在main.py

func3.py

在func1.py

import subprocess


class ProcReader():
    def __init__(self,python_file):
        self.proc = subprocess.Popen(['python2',python_file],stdout=subprocess.PIPE)

    def __iter__(self):
        return self

    def __next__(self):
        while True:
            line = self.proc.stdout.readline()
            if not line:
                raise StopIteration
            return line


r1 = ProcReader("func1.py")
r2 = ProcReader("func2.py")
r3 = ProcReader("func3.py")


for l1,l2,l3 in zip(r1,r2,r3):
    d1 = l1.decode('utf-8').strip().split(",")
    d2 = l2.decode('utf-8').strip().split(",")
    d3 = l3.decode('utf-8').strip().split(",")
    print(f"{d1[0]}:{d1[1]},{d2[1]},{d3[1]}")
    import pdb
    pdb.set_trace()

在func2.py

from frozenmodule import FrozenModule

def callback(k,v):
    with open("f1.txt",'a') as f:
        print(f"{k},{v}")
        f.write(f"{k},{v}\n")
        fm.match = next(iter_items,None)
        # somehow pause here,maybe use yield?


SELECTED = [1,5,8]
FAKE_DATA = {1: 'a',5: 'b',8: 'c'}
iter_items = iter(SELECTED)
fm = FrozenModule(FAKE_DATA,callback)
fm.match = next(iter_items,None)
fm.run()

在func3.py

from frozenmodule import FrozenModule

def callback(k,v):
    with open("f2.txt",{v}\n")
        # somehow pause here,maybe use yield?
        # then get value from func1.py and set to fm.match
        fm.match = next(iter_items,None)



SELECTED = [1,8]
FAKE_DATA = {1: 'i',5: 'j',8: 'k'}
iter_items = iter(SELECTED)
fm = FrozenModule(FAKE_DATA,None)
fm.run()

在Frozenmodule.py

from frozenmodule import FrozenModule

def callback(k,v):
    with open("f3.txt",None)
        


SELECTED = [1,8]
FAKE_DATA = {1: 'x',5: 'y',8: 'z'}
iter_items = iter(SELECTED)
fm = FrozenModule(FAKE_DATA,None)
fm.run()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-