Python - 如何通过subprocess.Popen使用冒号内部参数执行函数?

时间:2017-06-26 07:00:09

标签: python parameters subprocess popen

我正在尝试使用subprocess.open来执行带参数的python函数(start和end都是字符串格式),但我总是得到语法错误

  

“SyntaxError:语法无效”

当我执行python(python2.7 check.py)时,得到如下错误,

import check ; print check .check_output(06:34:00,06:36:00)
                                                     ^
SyntaxError: invalid syntax
output:

我的代码check.py:

def alert(start,end):
   print "start:"+str(start)
   print "end :"+str(end)


start = "06:34:00"
end = "06:36:00"
cmd = "python2.7 -c 'import check ; print check.check_output('"+str(start)+"','"+str(end)+"')' >> /log/debug.log"
print cmd
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
(output, err) = p.communicate()

p_status = p.wait()
print "output:"+str(output)

我认为问题是我的参数包含冒号(:),如何在函数参数中使用冒号?有什么建议?谢谢你的帮助。

1 个答案:

答案 0 :(得分:3)

您不会在命令中添加引号,因此会被严重解释。但是,由于它不清楚你的功能是什么以及你想如何打电话给他们,这里有一个你正在努力实现的例子。

check.py

def check_output(*args):
    print("CALLED: check_output({})".format(", ".join([repr(x) for x in args])))

它只保存一个函数并打印出它所调用的参数。例如,如果您要从shell调用它:

python -c "import check; check.check_output(\"foo\", \"bar\")"

它将打印到STDOUT:

CALLED: check_output('foo', 'bar')

所以现在如果你想从另一个Python脚本中调用它,你可以使用subprocess模块达到相同的效果,只要你正确地转义你的参数。例如,如果您有另一个test.py脚本:

import subprocess

foo = 'Foo'
bar = 'Bar'

# using 'raw' strings so we don't need to double escape each backslash
cmd = r'python -c "import check; check.check_output(\"' + foo + r'\", \"' + bar + r'\")"'

proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)
out, err = proc.communicate()

print("OUTPUT: " + out)

然后运行它,你会得到:

OUTPUT: CALLED: check_output('Foo', 'Bar')

注意 - 在构建您的查询字符串时,您的变量也必须转义,就像我们在示例中转义引号一样。

您还可以让subprocess模块通过将您的命令设为:

来完成大部分转义操作
cmd = [
    'python',
    '-c',
    'import check; check.check_output("' + foo + '", "' + bar + '")'
]

您可以使用str.format()使其更安全,或者至少更容易管理:

cmd = [
    'python',
    '-c',
    'import check; check.check_output("{}", "{}")'.format(foo, bar)
]

然后,您不必担心严重逃脱的角色。