使用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
在这里是不必要的。