我正在尝试使用Python 2.7中的Popen从另一个python脚本打开一个python脚本。
这两个脚本是:
child.py :逐个完成5个整数并等待一段时间并打印其正方形
import time
for i in range(5):
value = int(raw_input('Enter an integer: '))
time.sleep(2)
print "Its square is ", value*value
parent.py :打开child.py并将5个整数写入其标准输入并打印其标准输出
import subprocess, time
# following is the line of interest
child_program = subprocess.Popen("child.py",
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
for i in range(5):
child_program.stdin.write(str(i)+"\n")
child_program.stdin.flush()
a = child_program.stdout.readline()
print [a] # I put it in list just to see exact format
以下是在stackoverflow中看到许多类似问题之后我在parent.py中用于Popen构造函数的第一个参数的其他替换
"./child.py": Same WindowsError is produced
<full path>: Same WindowsError is produced
["python", "child.py"]: Did not raise error but opened python (useless)
产生的WindowsError是:
WindowsError: [Error 193] %1 is not a valid Win32 application
答案 0 :(得分:0)
首先,您必须指定要作为子流程打开的文件类型
child_program = subprocess.Popen(['executable','child.py'],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
这可以解决您的问题。
答案 1 :(得分:0)
如果你有Python解释器设置来处理* .py文件,那么你可以在你的Popen构造函数中设置shell=True
:
child_program = subprocess.Popen("child.py",
shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
正如其他人所指出的那样,此方法带有安全警告,因此您必须注意您传递给Popen的参数不会被恶意构建(对于例如,如果您从用户输入中获取了一些参数):https://docs.python.org/3/library/subprocess.html#security-considerations
否则,您需要告诉Popen使用Python可执行文件加载文件,如下所示:
import sys
child_program = subprocess.Popen([sys.executable, "child.py"],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
在此上下文中,sys.executable
将解析为用于启动父脚本的Python二进制文件的完整路径。
答案 2 :(得分:0)
Popen
,其中shell=False
代表默认CreateProcess
代表ShellExecute
作为its docs。该API函数只能运行可执行文件(无论其扩展名如何)。
你需要
shell=True
的机器来运行如上所述的命令行,以适应文件类型关联。例如。指定New rule
(注意文档中的安全警告),因为cmd.exe
falls back to ShellExecute
for non-executable files。