簡體   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