Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
win32上的Python子进程在没有shell=True的情况下无法工作_Python_Shell_Subprocess - Fatal编程技术网

win32上的Python子进程在没有shell=True的情况下无法工作

win32上的Python子进程在没有shell=True的情况下无法工作,python,shell,subprocess,Python,Shell,Subprocess,这可能看起来很奇怪,但我正试图通过subprocess.check_call()在Python脚本中使用Perl的CPAN。由于某些原因,它不起作用,并出现以下错误: WindowsError: [Error 2] The system cannot find the file specified 当我尝试正常运行命令时 使用shell=True可以解决问题,但我已经了解到这可能会带来一些安全问题。有人能给我解释一下为什么会发生这种情况,有没有办法解决 编辑:示例代码 下面是我如何使用chec

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

WindowsError: [Error 2] The system cannot find the file specified
当我尝试正常运行命令时

使用shell=True可以解决问题,但我已经了解到这可能会带来一些安全问题。有人能给我解释一下为什么会发生这种情况,有没有办法解决

编辑:示例代码

下面是我如何使用check_call()浏览列表:

谢谢

subprocess.Popen(),并重定向标准输出,以便检查输出

import subprocess as s
import shlex

k = "DateTime"

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

print output, err

您试图运行什么命令?它住在哪里?您使用的是它的完整路径还是简单的名称?我正在尝试运行许多命令来安装perl包,例如“cpan install Win32::API”。。。所有这些都遵循相同的约定,其中Win32::API是包名。。。这只是一个简单的名字,但是cpan目录在我的系统和用户%PATH%中。您能举一个例子说明如何编写您的check_call()吗?用一个例子编辑,谢谢您的帮助!使用
cpan
的完整路径是否可以在不使用shell的情况下工作?我的错误与
check\u call()
相同。请键入此命令的输出:
import os
print os.environ[“COMSPEC”]
C:\\Windows\\system32\\cmd.exe
这真是奇怪。根据它的说法,在Windows上,您唯一应该使用shell=True的时间是在调用内置程序时。我非常确定cpan不是windows内置的。是的,cpan绝对不是,我今天在草莓perl下安装了它,完整路径是
c:\草莓\perl\bin\cpan
import subprocess as s
import shlex

k = "DateTime"

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

print output, err