代码之家  ›  专栏  ›  技术社区  ›  Xeberdee

路径字符串中的子进程空间

  •  0
  • Xeberdee  · 技术社区  · 6 年前

    我有一个奇怪的情况,我有一个方法用同一个方法两次从一个路径调用一个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:\我的应用程序\ffprobe.exe ,或更改 self.program_根目录 ,如果我注释掉对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*
    

    有人知道为什么会这样吗?

    1 回复  |  直到 6 年前
        1
  •  0
  •   blhsing    6 年前

    不管它第一次工作的原因是什么,如果命令的路径名包含空格,则应该始终引用命令。更改分配给的行 cmd 收件人:

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