简单的Python脚本没有正确执行

时间:2015-09-04 16:26:02

标签: python windows subprocess

代码如下:

    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有点新鲜。

1 个答案:

答案 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()才能运行它。