如何在没有shell = True的情况下使用subprocess.call

时间:2012-05-31 02:19:21

标签: python windows

The documents建议不要将subprocess.callshell=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']))并且可行。但问题仍然存在......如果没有完整的路径,你怎么做?只是让它从工作目录执行?

2 个答案:

答案 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一起使用。