Python subprocess.call - 向subprocess.call添加变量

时间:2013-03-13 20:44:46

标签: python subprocess windowserror

我正在尝试用Python编写一个简单的程序,它从我的Downloads文件夹中获取所有音乐文件并将它们放入我的Music文件夹中。我正在使用Windows,我可以使用cmd提示移动文件,但是我收到此错误:

WindowsError: [Error 2] The system cannot find the file specified

这是我的代码:

#! /usr/bin/python

import os 
from subprocess import call

def main():
    os.chdir("C:\\Users\Alex\Downloads") #change directory to downloads folder

    suffix =".mp3"    #variable holdinng the .mp3 tag
    fnames = os.listdir('.')  #looks at all files

    files =[]  #an empty array that will hold the names of our mp3 files

    for fname in fnames:  
        if fname.endswith(suffix):
            pname = os.path.abspath(fname)
            #pname = fname
            #print pname

            files.append(pname)  #add the mp3 files to our array
    print files

    for i in files:
        #print i 
        move(i)

def move(fileName):
    call("move /-y "+ fileName +" C:\Music")
    return

if __name__=='__main__':main()

我看过subprocess图书馆和无数其他文章,但我仍然不知道我做错了什么。

3 个答案:

答案 0 :(得分:5)

subprocess.call方法获取参数列表而不是带空格分隔符的字符串,除非您告诉它使用不建议的shell,如果该字符串可以包含来自用户输入的任何内容。

最好的方法是将命令构建为列表

e.g。

cmd = ["move", "/-y", fileName, "C:\Music"]
call(cmd)

这也使得更容易将带有空格的参数(例如路径或文件)传递给被调用程序。

这两种方式都在subprocess documentation中给出。

你可以传入一个分隔的字符串,但是你必须让shell处理参数

call("move /-y "+ fileName +" C:\Music", shell=True)

同样在这种情况下移动有一个python命令来执行此操作。 shutil.move

答案 1 :(得分:0)

我没有直接回答你的问题,但是对于这样的任务,plumbum很棒,会让你的生活变得更加容易。 subprocess的api不是很直观。

答案 2 :(得分:0)

可能有几个问题:

  1. fileName可能包含空格,因此move命令只能看到文件名的一部分。

  2. 如果move是内部命令;您可能需要shell=True来运行它:

  3. from subprocess import check_call
    
    check_call(r"move /-y C:\Users\Alex\Downloads\*.mp3 C:\Music", shell=True)
    

    .mp3个文件从“下载”文件夹移至“没有subprocess的音乐:

    from glob import glob
    from shutil import move
    
    for path in glob(r"C:\Users\Alex\Downloads\*.mp3"):
        move(path, r"C:\Music")