当使用带命令和参数的 python 子进程时,“ OSERror.[ Errno2]没有这样的文件或目录”

我正在尝试运行一个程序,使用 subprocess.call()在 Python 代码中进行一些系统调用,这会抛出以下错误:

Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/lib/python2.7/subprocess.py", line 493, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory

我的实际 Python 代码如下:

url = "/media/videos/3cf02324-43e5-4996-bbdf-6377df448ae4.mp4"
real_path = "/home/chanceapp/webapps/chanceapp/chanceapp"+url
fake_crop_path = "/home/chanceapp/webapps/chanceapp/chanceapp/fake1"+url
fake_rotate_path = "/home/chanceapp/webapps/chanceapp.chanceapp/fake2"+url
crop = "ffmpeg -i %s -vf "%(real_path)+"crop=400:400:0:0 "+ "-strict -2 %s"%(fake_crop_path)
rotate = "ffmpeg -i %s -vf "%(fake_crop_path)+"transpose=1 "+"%s"%(fake_rotate_path)
move_rotated = "mv"+" %s"%(fake_rotate_path)+" %s"%(real_path)
delete_cropped = "rm "+"%s"%(fake_crop_path)
#system calls:
subprocess.call(crop)

对于如何解决这个问题,我能得到一些相关的建议吗?

234097 次浏览

如果要向 subprocess.call传递字符串,请使用 shell=True

来自 医生:

如果传递单个字符串,则 shell必须是 True或 否则,字符串必须简单地命名要执行的程序 指定任何参数。

subprocess.call(crop, shell=True)

或:

import shlex
subprocess.call(shlex.split(crop))

不能更新,所以我会转发@jfs 评论,因为我认为它应该更加可见。

@ AnneTheAgile: shell = True 不是必需的,而且你不应该使用 除非有必要(请参阅@void 的注释) ,否则应该通过 将每个命令行参数作为一个单独的列表项,而不是使用 [‘ command’,‘ arg 1’,‘ arg 2’]而不是“ command‘ arg 1’‘ arg 2’”。- Jfs 3’1510:02

如果您试图用双引号将文件参数放置到 Popen,也可以引发 No such file or directory

例如:

call_args = ['mv', '"path/to/file with spaces.txt"', 'somewhere']

在这种情况下,您需要删除双引号。

call_args = ['mv', 'path/to/file with spaces.txt', 'somewhere']