Python:子流程.Popen可变行为

2024-04-23 11:41:16 发布

您现在位置:Python中文网/ 问答频道 /正文

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

# -*- 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中工作的命令行示例:

^{pr2}$

我真的想把它放在一个字符串中,就像在p2中一样,因为我用avidemux的正确变量将一个更大的文件列表连接到一个大字符串中。在


Tags: 文件inosdirloadfilefirstsubprocess
3条回答

shlex是一种方法,但是从文件路径来看,很明显您在Windows上运行,shlex假设了Unix-ish shell中使用的约定。他们会在窗户上给你惹麻烦。在

正如文档所说,底层的windowsapi调用接受一个字符串作为参数,因此在Windows上,通常将单个字符串传递给Popen()。在

哎呀!我看你已经发现了。但至少现在你知道为什么了

啊,你在那里传递了一连串的两个论点。如果需要,您需要使用shlex.split将其拆分:

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

或者传递一个字符串:

^{pr2}$

使用

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

请参阅docs关于Popen的命令参数。在

相关问题 更多 >