python - 使用 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 输出的内容是什么?我的例子正确吗?
解决方案
正如评论中所指出的,对于您提出的建议,一个非常优越的解决方案通常是重构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()
或其所有者兄弟姐妹无法处理的情况,否则您真的想避免。
推荐阅读
- outlook - 来自加载项的 Outlook 日历背景同步
- javascript - 在 React Native 中需要带有 babel-plugin-inline-import 的 SVG XML 内容
- python - 在 pyqt5 组合框中显示两个值并传递这些值
- python - 如何从 URL 读取图像(urllib.error.HTTPError:HTTP 错误 403:禁止)
- c# - 访问另一个脚本变量,但不能更改游戏内
- reactjs - 开玩笑测试给出错误“无法读取未定义的属性‘createElement’”
- python - Go/Python 异步桥接
- c - 如何解决 C 程序 int main 错误
- opengl - 在相机后面的位置进行广告牌时的伪影
- php - 当数组中有数组时,str_replace 是否完成?