Python:subprocess.Popen变量行为

时间:2013-12-06 03:48:02

标签: python python-3.x subprocess

我想读取目录中的所有文件,并通过命令行将它们传递给另一个程序。 以下是我的代码的一部分(这里是一个文件)似乎不起作用,我真的不明白为什么它不起作用。 我的代码(带有一点调试打印):

# -*- coding: iso-8859-15 -*-
# Python 3

avidemux_dir = "C:\\Program Files (x86)\\Avi Demux\\avidemux.exe"
start_dir = "F:\\aaa"          # without ending backslash!
extension = ".mpg"

import os
import subprocess


for dirpath, dirnames, filenames in os.walk(start_dir):
    if filenames:
        first_file = os.path.join(dirpath, filenames[0])
        test2 = "--load " + first_file        

print(dirpath)                #results in: F:\aaa\av01
print(first_file)             #results in: F:\aaa\av01\av01.mpg
print(test2)                  #results in: --load F:\aaa\av01\av01.mpg


p1 = subprocess.Popen([avidemux_dir, "--load", first_file])
p2 = subprocess.Popen([avidemux_dir, test2])

对于此示例,avidemux仅对p1有效(加载正确的文件)。 p2不起作用。 那是为什么?

在.bat中运行的命令行示例:

avidemux.exe --load F:\aaa\av01\av01.mpg

我真的希望在p2中使用一个字符串,因为我将一个更大的文件列表连接到一个带有avidemux正确变量的大字符串。

4 个答案:

答案 0 :(得分:2)

shlex是一种方法,但从文件路径来看,显然你在Windows上运行,shlex假设在Unix-ish shell中使用的约定。他们可以让你在Windows上遇到麻烦。

正如文档所说,底层的Windows API调用只需要一个字符串作为参数,因此在Windows上,将一个字符串传递给Popen()通常要好得多。

糟糕!我看到你已经发现了这一点。但至少现在你知道为什么; - )

答案 1 :(得分:1)

使用

import shlex
p2 = subprocess.Popen([avidemux_dir] + shlex.split(test2))

请参阅docs关于Popen的命令args。

答案 2 :(得分:1)

啊,你在那里传递了两个参数的字符串。如有必要,您需要使用shlex.split分割它:

p2 = subprocess.Popen([avidemux_dir, *shlex.split(test2)])

或者只是传递一个字符串:

p2 = subprocess.Popen(avidemux_dir + ' ' + test2, shell=True)

答案 3 :(得分:1)

偶然发现了解决方案:在做类似的事情时不使用列表。 解决方案:

test2 = avidemux_dir + " --load " + first_file

p2 = subprocess.Popen(test2)  # no more list but the pure string.