繁体   English   中英

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

[英]How to use subprocess.call without shell=True

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


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

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

为您的编辑更新:您正在处理的内容听起来完全像此处所述的已知问题/错误: http : //bugs.python.org/issue8557以及此处的python子进程Popen环境PATH?

在win32下,当shell=False时,似乎subprocess.call的行为很奇怪。 看来您至少需要使用convert.exe而不convert并且需要自己搜索PATH

通过在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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM