首页 > 解决方案 > 路径字符串中的子进程空间

问题描述

我有一个奇怪的情况,我有一个方法在同一个方法中两次从路径调用 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*

有谁知道为什么会发生这种情况?

标签: pythonpython-3.xsubprocess

解决方案


不管它为什么在第一次工作,如果它的路径名包含空格,你应该总是引用你的命令。将分配给的行更改cmd为:

cmd = '"{}" -v quiet -print_format json -show_streams -show_format -sexagesimal'.format(root)

推荐阅读