首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python: subprocess.Popen变量行为

Python: subprocess.Popen变量行为
EN

Stack Overflow用户
提问于 2013-12-06 11:48:02
回答 4查看 405关注 0票数 0

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

代码语言:javascript
复制
# -*- 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中工作的命令行示例:

代码语言:javascript
复制
avidemux.exe --load F:\aaa\av01\av01.mpg

我真的希望在一个字符串中,就像在p2中一样,因为我将一个更大的文件列表连接到一个包含avidemux的正确变量的大字符串中。

EN

回答 4

Stack Overflow用户

发布于 2013-12-06 12:06:25

shlex是一种方法,但从文件路径可以明显看出,您是在Windows上运行的,并且shlex采用了Unix-ish shell中使用的约定。它们会在Windows上给你带来麻烦。

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

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

票数 2
EN

Stack Overflow用户

发布于 2013-12-06 11:58:41

使用

代码语言:javascript
复制
import shlex
p2 = subprocess.Popen([avidemux_dir] + shlex.split(test2))

请参见docs关于Popen的命令参数。

票数 1
EN

Stack Overflow用户

发布于 2013-12-06 12:04:38

啊,你在这里传递了一个包含两个参数的字符串。如有必要,需要使用shlex.split对其进行拆分

代码语言:javascript
复制
p2 = subprocess.Popen([avidemux_dir, *shlex.split(test2)])

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

代码语言:javascript
复制
p2 = subprocess.Popen(avidemux_dir + ' ' + test2, shell=True)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20415598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档