在subprocess命令中将句子作为参数传递

时间:2014-11-20 12:47:20

标签: python command-line

我正在另一个脚本中执行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终端

3 个答案:

答案 0 :(得分:2)

您可以使用字符串替换机制之一:

或者,对于subprocess库,您应该将参数作为列表传递给call函数:

subprocess.call(["python", "find_entity.py", line, str(line_num)])

查看lineline_num变量 - 它们没有任何引号传递,因此它们将按值传递。 建议使用此解决方案,因为它提供了更清晰明了的代码并提供了正确的参数处理(例如空格转义等)。

但是,如果要对shell=True使用subprocess.call标志,那么带有args列表的解决方案将无法使用字符串替换解决方案。 BTW,subprocessos提供了所有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)