我正在尝试使用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)
我认为问题是我的参数包含冒号(:),如何在函数参数中使用冒号?有什么建议?谢谢你的帮助。
答案 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)
]
然后,您不必担心严重逃脱的角色。