2

文档建议不要使用subprocess.callwith 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 的完整路径?如果是这样,我宁愿不这样做,因为我不知道所有 .exe 文件的位置。


只需使用程序的完整文件路径( )尝试过它就可以了call(['C:/imagemagick/convert.exe'])。但是问题仍然存在……如果没有完整路径,您将如何做到这一点?只是让它从工作目录执行?

4

2 回答 2

4

我相信dir是 cmd.com 的内置功能,而不是独立程序。您将需要 shell=True 或提供类似功能的程序dir(如 unixtools 中的 ls.exe 程序)。

为您的编辑更新:您正在处理的内容听起来与此处描述的已知问题/错误完全一样:http: //bugs.python.org/issue8557和此处的python 子进程 Popen 环境路径?

在 win32 下 subprocess.call的行为似乎shell=False很奇怪。似乎您至少需要使用convert.exenotconvert并且需要自己搜索PATH

于 2012-05-31T02:24:43.703 回答
2

dir.exe通过在 shell 中尝试可以更好地理解这里的问题:

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

This means that dir is not an executable anywhere in your %PATH% - rather, it is a command that the shell knows how to do without looking up a program for it. That means it will never, by definition, work with shell=False.

于 2012-05-31T02:25:10.593 回答