您没有在命令中添加引号,因此它会被错误地解释。但是,由于不清楚您的函数是什么以及如何调用它们,下面是一个您正在尝试实现的工作示例。在
在检查.py在def check_output(*args):
print("CALLED: check_output({})".format(", ".join([repr(x) for x in args])))
它只保存一个函数并打印出调用它的参数。例如,如果要从shell调用它:
^{pr2}$
它将打印到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)
]
那么你就不必担心逃逸的角色了。在