The documents建议不要将subprocess.call
与shell=True
一起使用,但是当我尝试做一些简单的事情时
call(['convert'])
我收到错误:
必须指定文件系统
当我通过cmd.exe运行相同的命令时,我得到了
C:\Users\Mark>convert
Version: ImageMagick 6.7.3-6 2011-11-10 Q16 http://www.imagemagick.org
...
等,即实际运行。
那么call
在做什么?为什么要查找文件?
它是否需要.exe的完整路径?如果是这样,我宁愿不这样做,因为我不知道所有.exes的位置。
尝试使用程序的完整文件路径(call(['C:/imagemagick/convert.exe'])
)并且可行。但问题仍然存在......如果没有完整的路径,你怎么做?只是让它从工作目录执行?
答案 0 :(得分:4)
我相信dir
是cmd.com的内置函数,而不是独立程序。您将需要shell = True或提供与dir
类似功能的程序(如unixtools中的ls.exe程序)。
更新您的编辑:您处理的内容与此处描述的已知问题/错误完全相同:http://bugs.python.org/issue8557和此处python subprocess Popen environment PATH?
当shell=False
在win32下很奇怪时,似乎subprocess.call的行为。您似乎至少需要使用convert.exe
而不是convert
,并且需要search PATH
yourself。
答案 1 :(得分:2)
通过在shell中尝试dir.exe
可以更好地理解这里的问题:
C:\Users\lvc>dir.exe
Volume in drive C has no label.
Volume Serial Number is 4B8C-511A
Directory of C:\Users\lvc
File Not Found
这意味着dir
在%PATH%
中的任何位置都不是可执行文件 - 相反,它是一个命令,shell无需查找程序就知道如何操作。这意味着根据定义,它永远不会与shell=False
一起使用。