
[英]7z command in Python 3.6 subprocess.run() on Windows
[英]Adapting a Complex System Command to subprocess.run()
我正在编写一个 Python3 脚本,它必须在我的 Ubuntu 20.04.5 LTS 机器上运行这个系统命令:
sudo su - otherUser -c "scp -P 1234 otherUser@10.10.10.10:/path/to/file/x.txt /tmp/x.txt"
当我手动将此命令粘贴到服务器的命令行时,该命令运行良好。 现在我需要我的 Python 脚本来执行它。 感谢这样的帖子,我相信subprocess.run()
命令应该在这里工作。
这是我的测试代码:
import subprocess
def main():
subprocess.run(["ls", "-l"]) # For testing purposes
print("===================================================================================")
cmd = ["sudo", "su - otherUser", "-c", "\"scp -P 1234 otherUser@10.10.10.10:/path/to/file/x.txt /tmp/x.txt\""]
print(cmd) # see the command first
subprocess.run(cmd)
if __name__ == "__main__":
main()
Output 是:
me@ubuntu01$ python3 testSubprocess.py
total 4
-rw-r----- 1 demo demo 576 Jan 18 21:08 testSubprocess.py
===================================================================================
['sudo', 'su - otherUser', '-c', '"scp -P 1234 otherUser@10.10.10.10:/path/to/file/x.txt /tmp/x.txt"']
sudo: su - otherUser: command not found
me@ubuntu01$
如您所知,我真的很困惑如何解析命令以便subprocess.run()
可以理解它。 文档( 此处和此处)对像我这样的初学者帮助不大。 subprocess.run()
的格式为:
subprocess.run(args, *, ...lots of other stuff...)
... args
在哪里:
所有调用都需要 args 并且应该是一个字符串,或者程序序列 arguments。通常首选提供 arguments 的序列,因为它允许模块处理任何所需的 escaping 和 arguments 的引用(例如允许空格文件名)。 如果传递单个字符串,则 shell 必须为 True(见下文),否则字符串必须简单地命名要执行的程序而不指定任何 arguments。
我没有完全遵循这一点,但我确实理解subprocess.run()
将获取一个字符串列表,这些字符串应该是要执行的命令。 好的。 有人可以解释如何分割我的原始命令吗?
通过反复试验找到解决方案。 原始代码定义命令如下:
cmd = ["sudo", "su - otherUser", "-c", "\"scp -P 1234 otherUser@10.10.10.10:/path/to/file/x.txt /tmp/x.txt\""]
...以及有效的解决方案:
cmd = ["sudo", "su", "otherUser", "-c", "scp -P 1234 otherUser@10.10.10.10:/path/to/file/x.txt /tmp/x.txt"]
IE:
"su - otherUser"
分解为"su", "otherUser"
问题未解决?试试以下方法:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.