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

kulphzqa  于 2023-08-07  发布在  Windows
关注(0)|答案(3)|浏览(113)

文档建议不要将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的完整路径?如果是这样的话,我宁愿不这样做,因为我不知道所有的. ex都在哪里。
刚刚尝试了它与完整的文件路径到一个程序(call(['C:/imagemagick/convert.exe']))和工程。但问题仍然存在...没有完整的路径你怎么做?只是让它从工作目录执行?

mqkwyuun

mqkwyuun1#

我相信dir是www.example.com的一个内置函数cmd.com,而不是一个独立的程序。您需要shell=True或提供与dir类似功能的程序(如unixtools中的ls.exe程序)。
更新为您的编辑:您正在处理的问题听起来与这里描述的已知问题/错误完全相同:http://bugs.python.org/issue8557,这里是python subprocess Popen environment PATH?
当subprocess.callshell=False在win32下运行时,www.example.com的行为似乎很奇怪。看起来你至少需要使用convert.exe而不是convert,你需要自己搜索PATH

x8diyxa7

x8diyxa72#

通过在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一起工作。

qnyhuwrf

qnyhuwrf3#

巧合的是,我有这个确切的问题与确切的可执行文件。这篇文章帮助我指出了原因。
在我看来:

subprocess.call([shutil.which("convert")])

字符串
是解决这个问题的一个简单和便携的解决方案。

相关问题