Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用子进程转义路径名中的空格键?_Python_Shell_Subprocess - Fatal编程技术网

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

Python 如何使用子进程转义路径名中的空格键?,python,shell,subprocess,Python,Shell,Subprocess,我正在尝试使用ffmpeg将文件从.m4a转换为.mp3,我需要访问音乐文件夹 此文件夹的路径名为:C:\\Users\ab\Desktop\Music 我无法使用subprocess.call()访问它,因为只有C:\\Users\A被识别。不处理空白 下面是我的python脚本: import constants import os import subprocess path = 'C:\\Users\A B\Desktop\Music' def main(): files = so

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

此文件夹的路径名为:
C:\\Users\ab\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:没有这样的文件或目录


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

预先编辑:空格与否,下面的命令行
-I
对于
ffmpeg
不正确,因为它需要
-I
选项,然后输入文件和输出文件,首先不是目录。因此,这里有不止一个问题(这解释了您收到的“权限被拒绝”消息,因为
ffmpeg
试图将目录作为文件打开!)

我想你想:

  • 从目录中读取所有文件
  • 将它们全部转换为位于同一目录中的文件
在这种情况下,您可以向输入和输出绝对值文件添加引号,如下所示:

subprocess.call('ffmpeg -i "{0}\{1}" "{0}\{2}"'.format('C:\\Users\A B\Desktop\Music', inFile, outFile))
这会起作用,但这不是最好的做法:性能不是很好,使用
格式
当您已经拥有所有参数时,您可能不知道要转义的其他字符,等等。。。不要重新发明轮子

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

path = r'C:\Users\A B\Desktop\Music'  # use raw prefix to avoid backslash escaping
subprocess.call(['ffmpeg','-i',os.path.join(path,inFile), os.path.join(path,outFile)])
旁白:如果你是有问题的用户,最好是:

path = os.getenv("USERPROFILE"),'Desktop','Music'
您甚至可以使用
cwd
选项在
path
目录中运行该进程:

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

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

您知道为什么我获得了C:\Users\A B\Desktop\Music:权限被拒绝吗?啊,这是另一个故事:在windows中,除非您是管理员,否则您无法访问其他用户配置文件(如果你有这些特权,打开一个提升的外壳是最好的方式)奇怪的是,我是管理员即使你是管理员,也没有其他用户配置文件以管理员身份运行。这是一种额外的安全措施。我在管理员授权下打开了cmd,并从命令提示符下启动了我的脚本。不起作用,你如何从PyCharm以管理员身份运行?