4

我想从我的程序中生成(fork?)多个 Python 脚本(也是用 Python 编写的)。

我的问题是我想为每个脚本指定一个终端,因为我将使用pexpect.

我试过使用pexpect, os.execlpos.forkpty但它们都没有按我的预期做。

我想生成子进程并忘记它们(它们将处理一些数据,将输出写入我可以读取的终端,pexpect然后退出)。

是否有任何图书馆/最佳实践/等。完成这项工作?

ps 在你问我为什么要写入 STDOUT 并从中读取之前,我要说我不写入 STDOUT,我读取了tshark.

4

4 回答 4

5

查看子流程模块

subprocess 模块允许您生成新进程,连接到它们的输入/输出/错误管道,并获取它们的返回码。该模块旨在替换其他几个较旧的模块和功能,例如:

操作系统

os.spawn*

os.popen*

popen2.*

命令。*

于 2009-06-07T13:12:46.050 回答
1

从 Python 3.5 开始,您可以执行以下操作:

    import subprocess

    result = subprocess.run(['python', 'my_script.py', '--arg1', val1])
    if result.returncode != 0:
        print('script returned error')

这也会自动重定向标准输出和标准错误。

于 2020-01-11T13:34:10.543 回答
0

我不明白你为什么需要为此期望。tshark应该将其输出发送到标准输出,并且只有出于某种奇怪的原因才会将其发送到标准错误。

因此,你想要的应该是:

import subprocess

fp= subprocess.Popen( ("/usr/bin/tshark", "option1", "option2"), stdout=subprocess.PIPE).stdout
# now, whenever you are ready, read stuff from fp
于 2009-06-09T14:15:19.953 回答
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 中做一堆终端,你只需要替换 pextpext.spawn 行中的'python'

注意:我没有测试过上面的代码。我只是从过去的经验中回复 pexpect。

于 2014-07-12T17:14:43.860 回答