代码如下:
fh = tempfile.NamedTemporaryFile(delete=False,suffix = '.py')
stream = io.open(fh.name,'w',newline='\r\n')
stream.write(unicode(script))
stream.flush()
stream.close()
proc = subprocess.Popen(
[path,fh.name],
shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
proc.stdin.close()
proc.stderr.close()
out = proc.stdout.readline()
print out
script是一个包含子进程代码的字符串,在本例中是一个简单的hello世界。因为它有unix文件结尾,所以我必须使用io.open才能正确地为windows编写它。 path是我机器上python.exe的路径。该文件已生成,在记事本中看起来很好:
def main():
print 'hello world'
但是,当我运行程序时,子进程执行并且什么都不做。 它不是可执行路径的问题,我已经用其他程序对它进行了测试,因此它必须与临时文件本身或其中的文本一起使用。 Delete设置为false以检查文件的内容以进行调试。这段代码有什么明显的错误吗?我使用Popen有点新鲜。
答案 0 :(得分:1)
您的程序中的主要问题是,当您指定shell=True
时,您需要将整个命令作为字符串提供,而不是列表。
鉴于此,你真的没有必要使用shell=True
,除非绝对必要,否则你不应该使用shell=True
,这是一个安全隐患,这在{{3 }}
执行包含来自不受信任源的未经过处理的输入的shell命令会使程序容易受到shell注入攻击,这是一个严重的安全漏洞,可能导致任意命令执行。因此,在从外部输入构造命令字符串的情况下,使用shell = True 强烈不鼓励:
此外,如果您不想使用stdin
/ stderr
(因为您在启动流程后立即将其关闭),则无需使用PIPE
对他们来说。
示例 -
fh = tempfile.NamedTemporaryFile(delete=False,suffix = '.py')
stream = io.open(fh.name,'w',newline='\r\n')
stream.write(unicode(script))
stream.flush()
stream.close()
proc = subprocess.Popen(
[path,fh.name],
stdout=subprocess.PIPE,
)
out = proc.stdout.readline()
print out
此外,脚本 -
def main():
print 'hello world'
不起作用,因为您需要调用main()
才能运行它。