aka*_*mov 4 python shell subprocess
我正在尝试将文件转换.m4a为.mp3使用ffmpeg,我需要访问音乐文件夹.
该文件夹的路径名是: 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()
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我得到一个错误,指出:
C:\ Users\A:没有这样的文件或目录
我想知道有人知道如何把我的完整路径名(C:\Users\A B\Desktop\Music)放进去subprocess.call()吗?
事先编辑:空格或没有,下面的命令行-i <directory> <infilename> <outfilename>是不正确ffmpeg,因为它预期的-i选项,然后输入文件和输出文件,不是目录第一.所以你在这里有多个问题(这解释了你的"权限被拒绝"消息,因为ffmpeg它试图将目录作为文件打开!)
我想你想要:
在这种情况下,您可以为这两个输入和输出绝对文件添加引号,如下所示:
subprocess.call('ffmpeg -i "{0}\{1}" "{0}\{2}"'.format('C:\\Users\A B\Desktop\Music', inFile, outFile))
Run Code Online (Sandbox Code Playgroud)
这样做可行,但这不是最好的事情:不是很有效率,使用format已经拥有所有参数的时候,你可能不知道要逃脱的其他角色等等......不要重新发明轮子.
最好的方法是在列表中传递参数,以便subprocess模块在必要时处理引用/转义:
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)])
Run Code Online (Sandbox Code Playgroud)
除此之外:如果你是有问题的用户,那么做得更好:
path = os.getenv("USERPROFILE"),'Desktop','Music'
Run Code Online (Sandbox Code Playgroud)
你甚至可以path使用cwd选项在目录中运行该进程:
subprocess.call(['ffmpeg','-i',inFile, outFile],cwd=path)
Run Code Online (Sandbox Code Playgroud)
如果您不是,请确保以提升的权限运行脚本,否则您将无法访问其他用户目录(读保护)
| 归档时间: |
|
| 查看次数: |
661 次 |
| 最近记录: |