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