Python subprocess调用具有多重引号的参数

5
我使用以下命令在bash中执行Python脚本。
python myfile.py -c "'USA'" -g "'CA'" -0 "'2011-10-13'" -1 "'2011-10-27'"

我正在编写一个Python脚本来包装它。目前我必须使用os.system(我知道,这很糟糕),因为我无法弄清楚如何使子进程Popen与引号一起正常工作。传入的字符串变量中必须维护内部单引号。
请有人帮我确定如何格式化传递给subprocess.Popen的第一个变量。
3个回答

8

您不需要转义值。对于进程,所有内容都被视为字符串传递。

您可以使用shlex模块来确定传递变量的最佳方式:

import shlex
shlex.split('python myfile.py -c "USA" -g "CA" -0 "2011-10-13" -1 "2011-10-27"') 
['python',
 'myfile.py',
 '-c',
 'USA',
 '-g',
 'CA',
 '-0',
 '2011-10-13',
 '-1',
 '2011-10-27']

这是首选的OneWayToDoIt(tm)。 - Raymond Hettinger
请注意,这不适用于Windows环境,因为shlex是针对Unix shell设计的。 - Chris Matta

4

您应该能够使用subprocess.Popen启动脚本,即使参数带引号:

subprocess.Popen([
   "/usr/bin/python", 
   "myfile.py",
   "-c",
   "'USA'",
   "-g",
   "'CA'",
   "-0",
   "'2011-10-13'",
   "-1",
   "'2011-10-27'",
])

0

你试过这个吗?

import subprocess
subprocess.Popen(['python', 'myfile.py', '-c', "'USA'", '-g', "'CA'", '-0', "'2011-10-13'", -1, "'2011-10-27'"]).communicate()

您可以在myfile.py中使用此代码来检查从bash获取的内容是否与从subprocess.Popen获取的内容相同(在我的情况下匹配):

import sys
print sys.argv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接