无法使用 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)
我无法 运行 使用包含 *
登录命令的 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)