为什么Python错误地调用子进程命令?
这是对上一个问题的跟进,因为我已经取得了进展(这一点与此无关)。值得注意的是,我正在学习python,几乎不知道自己在做什么,但我熟悉编程。我试图通过python在windows终端中调用SCP命令。然而,它并没有达到预期的效果。该脚本运行平稳,没有错误,并按我编写的方式打印调试命令。然而,SCP呼叫实际上并没有在另一端通过。为了确保我有正确的命令,我将它设置为打印它之后调用的相同命令。当我复制这个打印的命令并将其粘贴到windows命令终端时,它会提供所需的效果。为什么同一个命令在python中不能正常工作?谢谢这是我的剧本:为什么Python错误地调用子进程命令?,python,terminal,scp,Python,Terminal,Scp,这是对上一个问题的跟进,因为我已经取得了进展(这一点与此无关)。值得注意的是,我正在学习python,几乎不知道自己在做什么,但我熟悉编程。我试图通过python在windows终端中调用SCP命令。然而,它并没有达到预期的效果。该脚本运行平稳,没有错误,并按我编写的方式打印调试命令。然而,SCP呼叫实际上并没有在另一端通过。为了确保我有正确的命令,我将它设置为打印它之后调用的相同命令。当我复制这个打印的命令并将其粘贴到windows命令终端时,它会提供所需的效果。为什么同一个命令在python
import subprocess
subprocess.run(['scp', 'c:/users/<name>/desktop/OOGA.txt', 'pi@<IP>:here/'], shell=True)
print ("done")
print ('scp', 'c:/users/<name>/desktop/OOGA.txt', 'pi@<IP>:here/')
导入子流程
subprocess.run(['scp','c:/users//desktop/OOGA.txt','pi@:here/'],shell=True)
打印(“完成”)
打印('scp','c:/users//desktop/OOGA.txt','pi@:here/'))
如果shell设置为True,请尝试使用原始字符串:
from subprocess import run as subrun
status = subrun(r'scp c:/users/<name>/desktop/OOGA.txt pi@<IP>:here/',shell=True)
print("Done")
print(status)
从子流程导入作为子运行运行
status=subrun(r'scp c:/users//desktop/OOGA.txt pi@:here/',shell=True)
打印(“完成”)
打印(状态)
最简单的解决方案是使用函数拆分字符串命令
import subprocess
import shlex
cmd = r'scp c:/users/<name>/desktop/OOGA.txt pi@<IP>:here/'
subprocess.check_call(shlex.split(cmd))
导入子流程
导入shlex
cmd=r'scp c:/users//desktop/OOGA.txt pi@:here/'
子进程check_调用(shlex.split(cmd))
如果某些东西仍然不起作用,你可以检查我的或其他人的答案。也有很好的讨论为什么使用
shell=True
是不好的 当参数是一个列表时,shell=True
是没有意义的。当我不使用shell=True
时,我会得到一个很长的错误,这是我上一个问题的问题。我没有得到一个明确的答案,我发现唯一有效的方法是添加此参数。第一个参数应该是[command,arg1,arg2,…]
格式的列表,或者是带有完整命令行的单个字符串。当它是单个字符串时,shell=True
说明它是否应该使用shell来解析它。您的上一个问题在列表中只有一个字符串,这是错误的。我已为上一个问题添加了一个这样的答案。谢谢您的帮助。不幸的是,使用带有shell=true
的单个字符串会产生与此问题相同的结果,而将其拆分为不带shell=true
的字符串会产生与另一个相同的错误。