繁体   English   中英

Python脚本:使用子进程运行具有多个参数的脚本

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM