win32上的Python子进程无法使用shell = True

时间:2015-03-10 01:09:57

标签: python shell subprocess

这可能看起来很奇怪,但我试图通过subprocess.check_call()在Python脚本中使用Perl的CPAN。由于某种原因,它不起作用,并给出以下错误:

WindowsError: [Error 2] The system cannot find the file specified

当我尝试正常运行命令时。

使用shell = True修复了问题,但我已经读过这可能存在一些安全问题。有人可以向我解释为什么会发生这种情况并且有办法解决它吗?

编辑:示例代码

以下是我使用check_call()运行列表的方法:

packages = {'DateTime':'2','Win32::API':'2','Date::Manip':'2','XML::LibXML':'2','Carp::Assert':'2',
                    'Digest::CRC':'2','Data::Hexify':'2','Image::ExifTool':'2','File::Mork':'2','DateTime::Format::Strptime':'2',
                    'Parse::Win32Registry':'2','HTML::Scrubber':'2','Mac::PropertyList':'2','XML::Entities':'2'}

for k,v in packages.iteritems():
    try:
        res = check_call(shlex.split('cpan install %s' % k), shell=True)
        if res == 0:
            v = 0
    except CalledProcessError:

谢谢!

1 个答案:

答案 0 :(得分:0)

subprocess.Popen(),重定向stdout,以便检查输出。

import subprocess as s
import shlex

k = "DateTime"

proc = s.Popen(["cpan", "install", k], stdout=s.PIPE)
output, err = proc.communicate()

print output, err