如何用子进程转义路径名中的空格键?

2024-04-25 10:15:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用ffmpeg将文件从.m4a转换为.mp3,我需要访问音乐文件夹。在

此文件夹的路径名是:C:\\Users\A B\Desktop\Music

我不能用subprocess.call()访问它,因为只有C:\\Users\A被识别。不处理空白。在

下面是我的python脚本:

import constants
import os
import subprocess

path = 'C:\\Users\A B\Desktop\Music'

def main():

files = sorted(os.listdir(path), key=lambda x: os.path.getctime(os.path.join(path, x)))
if "Thumbs.db" in files: files.remove("Thumbs.db")

for f in files:
    if f.lower()[-3:] == "m4a":
        process(f)

def process(f):
inFile = f
outFile = f[:-3] + "mp3"

subprocess.call('ffmpeg -i {} {} {}'.format('C:\\Users\A B\Desktop\Music', inFile, outFile))

main()

当我运行它时,我得到一个错误,它指出:

C:\Users\A: No such file or directory

我想知道是否有人知道如何将我的完整路径名(C:\Users\A B\Desktop\Music)放入subprocess.call()?在


Tags: pathimport文件夹osdefmusicfilescall
1条回答
网友
1楼 · 发布于 2024-04-25 10:15:48

预先编辑:空格与否,下面的命令行-i <directory> <infilename> <outfilename>对于ffmpeg是正确的,因为它需要-i选项,然后输入文件和输出文件,而不是首先输入目录。所以这里有一个以上的问题(这解释了您收到的“permission denied”消息,因为ffmpeg试图以文件的形式打开目录!)在

我想你想:

  • 从目录中读取所有文件
  • 将它们全部转换为位于同一目录中的文件

在这种情况下,可以将引号添加到两个输入和输出绝对文件中,如下所示:

subprocess.call('ffmpeg -i "{0}\{1}" "{0}\{2}"'.format('C:\\Users\A B\Desktop\Music', inFile, outFile))

这是可行的,但这不是最好的做法:不是很有效,使用format当你已经有了所有的参数,你可能不知道其他字符可以转义,等等。。。不要重新发明轮子。在

最好的方法是传递列表中的参数,以便subprocess模块在必要时处理引用/转义:

^{pr2}$

旁白:如果您是问题用户,最好这样做:

path = os.getenv("USERPROFILE"),'Desktop','Music'

您甚至可以使用cwd选项在path目录中运行该进程:

subprocess.call(['ffmpeg','-i',inFile, outFile],cwd=path)

如果没有,请确保使用提升的权限运行脚本,否则将无法访问其他用户目录(读保护)

相关问题 更多 >