python - 路径字符串中的子进程空间
问题描述
我有一个奇怪的情况,我有一个方法在同一个方法中两次从路径调用 ffmpeg 可执行文件 - 第一次有效,但第二次无效,我不知道为什么。
ffmpeg 可执行文件位于路径中
c:\GUI\My app\ffprobe.exe
我用代码调用它
for n in (self.file_numbers):
master_file = n + '.mxf' # eg C31_9213.mxf
# Get Metadata 1st time (WORKS)
self.mastermeta = self.getMetadata(master_file)
# Get metadata for connected parts (DOESNT WORK)
self.parts_meta = []
if master_file: # read parts from a sidecar file...
with open(sidecar, 'r') as sc:
# sidecar file contains paths - should split '/' lines into list
linelist = [line.strip() for line in sc]
self.parts_from_file = [p.split('/') for p in linelist]
# OPTION Check parts & get metadata list for parts
if self.parts_from_file:
for p in self.parts_from_file:
part = str(p[-1]) # the last index is a filename C63_4526.mxf
print(part, type(part)) # prints filename and type string identical to above example.
partmeta = self.getMetadata(part)
self.parts_meta.append(partmeta)
getMetadata 函数(我第一次调用它时有效)看起来像这样......
def getMetadata(self, master_file=None):
root = "{}/ffprobe.exe".format(self.program_root.replace('\\', '/')) # /path/to/exe
cmd = "{} -v quiet -print_format json -show_streams -show_format -sexagesimal".format(root)
args = shlex.split(cmd)
args.append(master_file)
# GETS META FOR MASTER FILES::::
# run the ffprobe process, decode stdout into utf-8 & convert to JSON
ffprobeOutput = subprocess.check_output(args).decode('utf-8')
ffprobeOutput = json.loads(ffprobeOutput)
... more ...
<returns a list>
我没有从C:\My App\ffprobe.exe移动可执行文件,也没有更改self.program_root,如果我注释掉对 getMetadata 函数的第二次调用,它就可以工作。
路径中的空格第一次不会导致问题,但第二次我得到一个错误,即同一路径突然被 shlex.split 在文件夹名称中的空格处分成两部分....
*Traceback (most recent call last):
File "GUI_5.py", line 450, in <module>
gui = Main()
File "GUI_5.py", line 238, in __init__
self.setupUi(self)
File "GUI_5.py", line 155, in setupUi
self.openFolderDialog()
File "GUI_5.py", line 428, in openFolderDialog
partmeta = self.getMetadata(part)
File "GUI_5.py", line 292, in getMetadata
ffprobeOutput = subprocess.check_output(args).decode('utf-8')
File "c:\python35\Lib\subprocess.py", line 626, in check_output
**kwargs).stdout
File "c:\python35\Lib\subprocess.py", line 708, in run
output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command '['C:/GUI/My', 'app/ffprobe.exe', '-v', 'quiet', '-print_format', 'json', '-show_streams', '-show
_format', '-sexagesimal', "C45_0031.mxf'"]' returned non-zero exit status 1*
有谁知道为什么会发生这种情况?
解决方案
不管它为什么在第一次工作,如果它的路径名包含空格,你应该总是引用你的命令。将分配给的行更改cmd
为:
cmd = '"{}" -v quiet -print_format json -show_streams -show_format -sexagesimal'.format(root)
推荐阅读
- hybris - 按下按钮时可以使小部件可见吗?
- python - 如何拆分路径文件的组成结尾?
- json - 使用 Google Cloud Dataflow 在 Apache Beam 中进行 Json 验证
- php - 如何转义 php 行以验证 envato 主题检查?
- security - 如何防止我的 Prestashop 网站上的 Clickjacking 攻击?
- asp.net-web-api - 多种 GET 方法的 ASP.Net Web API 路由
- c# - 为自定义 PropertyDrawer 创建新的默认对象
- laravel - BelongsTo 在 Laravel Nova 中的翻译
- flutter - 根据可用空间限制小部件的数量
- reactjs - 检查状态以有条件地映射组件