[英]Python: subprocess and running a bash script with multiple arguments
[英]Python script : Running a script with multiple arguments using subprocess
我的问题与此先前的问题有关-Python子进程用法
我正在尝试使用python运行此命令
nccopy -k 4“ http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/ncep.reanalysis2/pressure/air.2014.nc?air[408:603][2][20:34 ] [26:40] “ foo.nc
当我运行上述命令时,我应该能够在磁盘上看到一个名为foo.nc的文件,或者出现网络错误,指出无法访问该URL或找不到远程URL。
当前ESRL NOAA服务器已关闭-因此,当我运行以上命令时,
语法错误,意外的$ end,期望使用SCAN_ATTR或SCAN_DATASET或SCAN_ERROR上下文:^ NetCDF:访问失败位置:文件nccopy.c; 1348行
我在运行python脚本时应该遇到相同的错误
这是我的代码,我无法确切知道如何继续进行操作-
我尝试将“ -k 4”拆分为两个参数并删除引号,但仍然收到此错误nccopy:无效格式:4
打印结果(sys.argv)data.py
['data.py','-k','4',' http: //www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/ncep.reanalysis2/pressure/air.2014.nc?air [480:603] [20:34] [26:40] ','foo.nc']
import numpy as np
import subprocess
import sys
url = '"http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/ncep.reanalysis2/pressure/air.2014.nc?air[408:603][2][20:34][26:40]"'
outputFile = 'foo.nc'
arg1 = "-k 4"
arg3 = url
arg4 = outputFile
print (input)
subprocess.check_call(["nccopy",arg1,arg3,arg4])
代替arg1 =“ -k 4”,而使用两个参数。
import subprocess
url = 'http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/ncep.reanalysis2/pressure/air.2014.nc?air[408:603][2][20:34][26:40]'
outputFile = 'foo.nc'
arg1 = "-k"
arg2 = "4"
arg3 = url
arg4 = outputFile
subprocess.check_call(["nccopy", arg1, arg2, arg3, arg4])
另请参阅此处Python子流程参数
这里有两个难题。
一个子进程处理您的参数,并尝试使用4
作为单独的参数。
另一个是系统调用仍然遵循常规的shell规则,这意味着将对元字符 (也称为特殊字符)进行参数和命令的解析。 在这种情况下,您要包装[
和]
。
在那里,您需要将每个参数及其值分隔到参数列表中的单独对象中,例如-k 4
应该为['-k', '4']
并且需要将参数/值包装在'...'
而不是"..."
。
尝试一下, shlex.split()
可以为您工作,我在URL周围交换了封装字符:
import numpy as np
import subprocess
import sys
import shlex
url = "'http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/ncep.reanalysis2/pressure/air.2014.nc?air[408:603][2][20:34][26:40]'"
outputFile = 'foo.nc'
command_list = shlex.split('nccopy -k 4 ' + url + ' ' + outpufFile)
print(command_list)
subprocess.check_call(command_list)
如果您有一个运行中的shell命令,该命令运行带有多个参数的单个程序,并且想要对其进行参数化(例如,使用变量文件名而不是硬编码值),则可以使用shlex.split()
创建命令行列表您可以传递给subprocess
模块并用变量替换所需参数的参数,例如:
>>> shell_command = "python -c 'import sys; print(sys.argv)' 1 't w o'"
>>> import shlex
>>> shlex.split(shell_command)
['python', '-c', 'import sys; print(sys.argv)', '1', 't w o']
要使用与父脚本相同的Python解释器运行命令,可以使用sys.executable
,我们可以传递variable
而不是'1'
:
#!/usr/bin/env python
import random
import sys
import subprocess
variable = random.choice('ab')
subprocess.check_call([sys.executable, '-c', 'import sys; print(sys.argv)',
variable, 't w o'])
注意:
shlex.split()
'tw o'
中没有引号,即使用'tw o'
代替'"two"'
或"'tw o'"
subprocess
模块默认情况下不运行外壳程序,因此您不需要转义外壳程序元字符,例如命令行参数内的空格。 相反,如果您的命令使用了某些Shell功能(例如,文件模式),则可以在Python中重新实现相应的功能(例如,使用glob
模块),或者使用shell=True
并按原样将命令作为字符串传递。 在这种情况下,您可能需要pipes.quote()
来转义变量参数。 通配符在使用shlex的子进程调用中不起作用
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.