【问题标题】:Python subprocess.call - adding a variable to subprocess.call [duplicate]Python subprocess.call - 将变量添加到 subprocess.call [重复]
【发布时间】:2013-03-02 00:34:37
【问题描述】:

我正在尝试用 Python 编写一个简单的程序,该程序从我的下载文件夹中获取所有音乐文件并将它们放入我的音乐文件夹中。我使用的是 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 库和无数其他文章,但我仍然不知道我做错了什么。

【问题讨论】:

  • 您的fileName 不是包含空格吗?如果是,则必须改用'"' + fileName + '"',否则move 将找不到该文件。
  • 在旁注中,这些不是数组,而是列表
  • [os.rename](http://docs.python.org/2/library/os.html#os.rename)有什么问题

标签: python subprocess windowserror


【解决方案1】:

可能有几个问题:

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

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

from subprocess import check_call

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

要在没有subprocess 的情况下将.mp3 文件从下载文件夹移动到音乐:

from glob import glob
from shutil import move

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

【讨论】:

    【解决方案2】:

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

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

    例如

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

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      我不会直接回答您的问题,但对于此类任务,plumbum 非常棒,它会让您的生活变得更轻松。 subprocess的api不是很直观。

      【讨论】:

        猜你喜欢
        • 2021-04-07
        • 1970-01-01
        • 2011-02-05
        • 2018-02-17
        • 2012-07-06
        • 2012-03-18
        • 1970-01-01
        • 1970-01-01
        • 2018-08-19
        相关资源
        最近更新 更多