我有一个python脚本,可以从给定的输入生成许多shell命令.问题在于,当尝试执行生成的命令时,它会失败,但是当我自己运行生成的命令(即从命令行)时,它们将成功执行.这是生成的命令:find /home/me/downloader/0-29/ -...

我有一个python脚本,可以从给定的输入生成许多shell命令.问题在于,当尝试执行生成的命令时,它会失败,但是当我自己运行生成的命令(即从命令行)时,它们将成功执行.
这是生成的命令:
find /home/me/downloader/0-29/ -type f | grep -i .rpm$| xargs -i cp {} /home/me/downloader/builds/0-29/
这是由python脚本运行时的错误消息:
find: paths must precede expression: | Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
您能帮我了解问题出在哪里吗?
UPD:这是我用来执行生成的命令的功能:
def exec_command(command): process = subprocess.Popen(command.split(), stdout=subprocess.PIPE) output = process.communicate()[0] return output
解决方法:
由于您的命令是管道,因此必须设置shell = True,以便子进程将命令直接发送到shell:
command = 'find /home/me/downloader/0-29/ -type f | grep -i .rpm$| xargs -i cp {} /home/me/downloader/builds/0-29/'
subprocess.call(command, shell=True)
要么,
process = subprocess.Popen(command, shell=True)
output = process.communicate()[0]
return output
另外,请勿在带有管道的命令中使用python进行拆分.这将导致find被传递|作为其参数之一,而不是作为shell运算符.
看来命令也可以简化:
command="find /home/me/downloader/0-29/ -type f -iname '*.rpm' -exec cp {} /home/me/downloader/builds/0-29/ \;"
由于以上不再是管道,因此可以对其进行较小的修改,然后拆分为shell = False的子流程.修改之处在于,’*.rpm’周围的单引号用于保护glob免受外壳扩展.如果shell = False,则shell不会删除它们.所以,我们必须.对于shell = False并与command.split()一起使用:
command="find /home/me/downloader/0-29/ -type f -iname *.rpm -exec cp {} /home/me/downloader/builds/0-29/ \;"
本文标题为:Shell命令从python失败,从shell正常


基础教程推荐
- 无法使用Chrome和Firefox在Linux Mint上运行Selenium Python脚本 2023-11-11
- Linux软件:Anaconda安装python和自带Python 2023-09-03
- 用Python鉴黄(上) 2023-09-04
- python3使用ctypes在windows中访问C和C++动态链接库函数示例 2023-09-03
- Python随机采样及概率分布(二) 2023-08-11
- 使用Python实现给企业微信发送消息功能 2023-08-11
- Python实现如何根据文件后缀进行分类 2023-08-04
- python机器学习Github已达8.9Kstars模型解释器LIME 2023-08-09
- Anaconda如何查看自己目前安装的包详解 2023-08-04
- 通过VS下载的NuGet包修改其下载存放路径的操作方法 2022-10-20