我正在另一个脚本中执行python脚本,并希望将两个参数传递给它
lines = [line.strip('\n') for line in open('que.txt')]
for l in lines:
print 'my sentence : '
print l
#os.system("find_entity.py") //this also does not work
subprocess.call(" python find_entity.py l 1", shell=True) //this works but l does not considered as sentence which was read
什么是正确的方法?
更新
lines = [line.strip('\n') for line in open('q0.txt')]
for line_num, line in enumerate(lines):
cmd = ["python", "find_entity.py", line]
subprocess.call(cmd, shell=True)
然后它进入python终端
答案 0 :(得分:2)
您可以使用字符串替换机制之一:
在你的情况下,它看起来像
subprocess.call("python find_entity.py %s %d" % (line, line_num))
subprocess.call("python find_entity.py {} {}".format(line, line_num))
或者,对于subprocess
库,您应该将参数作为列表传递给call
函数:
subprocess.call(["python", "find_entity.py", line, str(line_num)])
查看line
和line_num
变量 - 它们没有任何引号传递,因此它们将按值传递。
建议使用此解决方案,因为它提供了更清晰明了的代码并提供了正确的参数处理(例如空格转义等)。
但是,如果要对shell=True
使用subprocess.call
标志,那么带有args列表的解决方案将无法使用字符串替换解决方案。 BTW,subprocess
和os
提供了所有shell强大的选项:例如脚本管道,扩展用户主目录(〜)等。所以,如果你要编写大而复杂的脚本,你应该使用python库代替使用shell=True
。
答案 1 :(得分:1)
你需要变量l的内容(我把它重命名为line),而不是字符串文字" l"
for line_num, line in enumerate(lines):
cmd = ["python",
"find_entity.py",
line,
str(line_num)]
subprocess.call(cmd, shell=True)
答案 2 :(得分:1)
如果您已将命令名及其参数放在单独的变量中,或者已经在列表中,那么您几乎不想使用shell=True
。 (它不是非法的,但它的行为没有记录,通常不是想要的。)
cmd = ["python", "find_entity.py", line]
subprocess.call(cmd)