如何解决Python2:在子流程中暂停或使用yield,然后从另一个流程中获取价值
我正在使用python3(下面的main.py
在python3中运行)编写程序,并利用现有的python扩展名(用c编写,使用python2编译),但我没有源代码。可以说FrozenModule
类来自此扩展。它确实做了很多事情,但是在这里只是试图简化它。基本上,我可以订阅事件,实际上我可以控制回调函数。这意味着我最有能力通过更新回调函数来更改流。
问题是我必须重新组织流程,并且想在每次调用回调函数时冻结/暂停。
我想要的最终结果是:
1:a,i,x
5:b,j,y
8:c,k,z
下面是我目前在这里得到的代码。但是它并不是按照我想要的方式工作。我添加了set_trace
只是为了检查流程。我获得正确输出的原因是因为我已经在SELECTED
和func2.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.py
和func2.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 举报,一经查实,本站将立刻删除。