首页 > 解决方案 > 使用 popen 在 2 个 python 脚本之间进行通信

问题描述

假设我们遇到了如图所示的问题。

scriptA.py                               scriptB.py

get directory
modify directory
run scriptB with directory as input
                                -------> get directory
                                         open .txt file
                                         scan its contents
                                <------- return content to scriptA
print content

我的 ScriptA 示例是:

import os
import subprocess
    
if __name__ == '__main__':
   directory = os.getcwd() + os.sep + 'some extension'
    
   p = subprocess.Popen("python ScriptB.py", stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
        
   results = p.communicate(input = str.encode(directory))[0]
    
   print(results)

但现在我不确定如何访问 ScriptB 中的输入。那么communicate检测 ScriptB 输出的内容是什么?我的例子正确吗?

标签: pythonsubprocesspopen

解决方案


正如评论中所指出的,对于您提出的建议,一个非常优越的解决方案通常是重构scriptB,以便您可以import从中scriptA直接调用它的函数,而无需单独的子流程。

如果你不能或不想这样做,最简单的安排是编写scriptB它接受命令行参数,并将结果打印到标准输出。

results = subprocess.run(
    ['python', 'scriptB.py', directory],
    check=True, text=True, capture_output=True).stdout

请注意shell=True,这里根本没有添加任何值,并且将命令行相应地划分为字符串列表。也许还可以参见子进程中“shell = True”的实际含义

如果您需要scriptB.py接受标准输入上的输入(通常,出于多种原因,这是一个可疑的设计),那并没有太大的不同;

result = subprocess.run(
    ['python', 'scriptB.py'],
    input=directory + '\n',
    check=True, text=True, capture_output=True).stdout

subprocess.Popen()除非您处于subprocess.run()或其所有者兄弟姐妹无法处理的情况,否则您真的想避免。


推荐阅读