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

使用python中的system(cmd)命令形成subprocess.call()语句,python,ssh,subprocess,Python,Ssh,Subprocess,我在system()语句中使用了一个ssh命令,但我想用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()语句替换

我在
system()
语句中使用了一个
ssh
命令,但我想用
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'"])
我所犯的错误是什么?正确的语法是什么?

该函数用于将命令行参数解析为正确的格式。这将解决您的语法错误:

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选项。请看下面的警告

另请注意:


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

假设
主机名中没有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(您原来的系统命令)
()获得参数列表,但是
shlex.split()
可能会被愚弄,因此它最有助于提示结果应该是什么样子。

您所说的“性能问题”是什么意思
subprocess.call()
的运行速度不应明显低于
os.system()
。如果它能工作,您的语法应该很好。@skrrgwsme我想使用
subprocess.call()
作为
os.system()
os.system()
给了我一些问题,比如它执行的时间和不执行或挂起的时间。我已经读到
subprocess.call()
是一个更好的选择。@skrrgwsme是我的
subprocess.call()
语法正确吗?我得到它的语法错误。在
subprocess.call()
shell=True
在这里是不必要的。