从python中的system(cmd)命令形成subprocess.call()语句

时间:2015-06-17 21:48:11

标签: python ssh subprocess

我在ssh语句中使用了system()命令,但我想用subprocess.call()语句替换它。我的ssh命令是:

cmd ="ssh -i pem-file.pem user@" + hostname + " 'cd /user/home/ && java -cp jar-file.jar com.packg.class -a opt1 -f text-file_" + ts + ".txt'"

system(cmd)

我想用subprocess.call()语句替换上面因为它给我一些性能问题而且我读到subprocess.call()是一个更好的选择。我制定了这个查询,但它没有执行:

result = subprocess.call(["ssh","-i", "pem-file.pem","user@" + hostname + " 'cd /user/home/ && java -cp jar-file.jar com.packg.class -a opt1 -f text-file_" + ts + ".txt'"])

我正在做的错误是什么,正确的语法是什么?

2 个答案:

答案 0 :(得分:0)

函数shlex.split()对于将命令行参数解析为正确的格式非常有用。这应该可以解决语法错误:

import shlex
import subprocess

cmd ="ssh -i pem-file.pem user@" + hostname + " 'cd /user/home/ && java -cp jar-file.jar com.packg.class -a opt1 -f text-file_" + ts + ".txt'"

result = subprocess.call(shlex.split(cmd))

如果这没有解决您的错误,那么您可以传递subprocess.call shell=True参数:

    import subprocess

cmd ="ssh -i pem-file.pem user@" + hostname + " 'cd /user/home/ && java -cp jar-file.jar com.packg.class -a opt1 -f text-file_" + ts + ".txt'"

result = subprocess.call(cmd, shell=True)

使用shell参数将导致您的命令通过shell执行,而不是让解释器解析它。但是,如果cmd可能来自不受信任的来源,请不要使用shell选项。请查看Python docs中的警告。

还有一点需要注意:

subprocess.system()os.system()更新,更灵活,但不要太担心升级"到新功能。 subprocess.call()的优点在于与子进程通信的更灵活的选项。如果你所做的只是执行一个命令并获得返回代码,那么os.system()可能就好了。如果你发现你的命令不稳定且不可靠,那么切换到subprocess.call()可能不会有太多帮助。

答案 1 :(得分:0)

假设hostname(可能)中没有shell元字符,您的命令可能如下所示:每个命令行参数都是一个单独的列表项:

#!/usr/bin/env python
import subprocess

cmd = ["ssh", "-i", "pem-file.pem",  "user@" + hostname,
       "cd /user/home/ && java -cp jar-file.jar com.packg.class -a opt1 "
       "-f text-file_" + ts + ".txt"]
subprocess.check_call(cmd)

os.system()不同;它没有运行(本地)shell。

您可以使用shlex.split(your_original_system_command)mentioned by @skrrgwasme)获取参数列表,但shlex.split()可能会被欺骗,因此它最适用于提示结果应如何显示。