我想从我的程序中生成(fork?)多个Python脚本(也用Python编写)。
我的问题是我想为每个脚本专用一个终端,因为我将使用pexpect
收集他们的输出。
我尝试过使用pexpect
,os.execlp
和os.forkpty
,但他们都没有像我预期的那样。
我想生成子进程并忘记它们(它们将处理一些数据,将输出写入终端,我可以用pexpect
读取然后退出)。
是否有任何图书馆/最佳实践/等。完成这份工作?
P.S。在你问我为什么要写STDOUT并从中读取之前,我会说我不写STDOUT,我读了tshark
的输出。
答案 0 :(得分:5)
子进程模块允许您生成新进程,连接到它们的输入/输出/错误管道,并获取它们的返回代码。该模块旨在替换其他几个较旧的模块和功能,例如:
使用os.system
os.spawn *
os.popen *
popen2。*
命令。*
答案 1 :(得分:0)
我不明白为什么你需要这个。 tshark
应该将其输出发送到stdout,并且只是出于某种奇怪的原因才会将其发送给stderr。
因此,你想要的应该是:
import subprocess
fp= subprocess.Popen( ("/usr/bin/tshark", "option1", "option2"), stdout=subprocess.PIPE).stdout
# now, whenever you are ready, read stuff from fp
答案 2 :(得分:0)
您想将一个终端 或 专用于一个python shell吗?
你已经为Popen和Subprocess提供了一些有用的答案,如果你还在计划使用它,你也可以使用pexpect。
#for multiple python shells
import pexpect
#make your commands however you want them, this is just one method
mycommand1 = "print 'hello first python shell'"
mycommand2 = "print 'this is my second shell'"
#add a "for" statement if you want
child1 = pexpect.spawn('python')
child1.sendline(mycommand1)
child2 = pexpect.spawn('python')
child2.sendline(mycommand2)
根据需要制作多个儿童/贝壳,然后使用child.before()或child.after()来获取您的回复。
当然你想要添加要发送的定义或类而不是" mycommand1",但这只是一个简单的例子。
如果你想在linux中制作一堆终端,你只需要替换' python'在pextpext.spawn行
注意:我还没有测试过上面的代码。我只是回答过去与pexpect的经历。
答案 3 :(得分:0)
从Python 3.5开始,您可以执行以下操作:
import subprocess
result = subprocess.run(['python', 'my_script.py', '--arg1', val1])
if result.returncode != 0:
print('script returned error')
这还会自动重定向stdout和stderr。