无法使用 python 子进程模块使用 * 运行 shell 命令

Unable to run shell commands with * using python subprocess module

我无法 运行 使用包含 * 登录命令的 python 子进程模块的任何命令。 我是这样调用的,

 subprocess.Popen(
            'cp /etc/varnida_sys/* /tmp/bucket/'.split(),
            stdout=subprocess.PIPE).communicate()[0]

为此我得到了,

cp: cannot stat ‘/etc/varnida_sys/*’: No such file or directory

为什么会出现这个错误,里面有一个文件/etc/varnida_sys/genders

我的调查表明使用像 * 这样的正则表达式需要一些特殊处理。我在所有包含 *.

的命令中遇到了一些错误

PS。当我从远程主机通过 paramiko 运行 执行相同的命令时,我没有收到错误。

* 仅被 shell 理解(将其扩展为文件列表),您需要将 shell=True 传递给 Popen()。另外,不需要拆分命令,您可以使用字符串:

subprocess.Popen("cp /etc/varnida_sys/* /tmp/bucket/",
                 stdout=subprocess.PIPE, shell=True).communicate()[0]

正如@triplee 在下面所建议的,最好为此任务使用一些方便的包装器,例如subprocess.call():

subprocess.call("cp /etc/varnida_sys/* /tmp/bucket/", shell=True)