为什么 subprocess.call() 不执行 scp 除非包含 "shell=True"?

Why does subprocess.call() not execute scp unless "shell=True" is included?

我的程序以这种方式安全复制:subprocess.run(scp -P 22 username@address.com:path/to/file $HOME/Downloads)

但它给了我以下错误:FileNotFoundError: [Errno 2] No such file or directory: 'scp -P 22 username@address.com:path/to/file $HOME/Downloads

但是,像这样添加 shell=True subprocess.run(scp -P 22 username@address.com:path/to/file $HOME/Downloads, shell=True) 可以解决问题。

这是为什么?有解决办法还是 shell=True 必不可少?

如果您查看文档,您会发现 subprocess.run 实际上需要一个值列表,而不是单个字符串:

subprocess.run( ["scp", "-P", "22", 
    "username@address.com:path/to/file"
    "$HOME/Downloads"] )

但是,这里还有另一个问题。 $HOME 是一个 shell 变量。如果不用shell=True,那么需要自己扩容:

subprocess.run( ["scp", "-P", "22", 
    "username@address.com:path/to/file",
    os.environ["HOME"]+"/Downloads"] )

您不需要指定“-P 22”。这是 ssh 的默认端口。