一般的命令行實用程序可以接收其參數爲命令行參數,但sir_util2而不是從stdin
經由C運行時功能fscanf
讀取用戶輸入。子過程便利函數call
,check_call
和check_output
不容易將輸入發送到stdin
。直接使用Popen
類,然後使用communicate
。
我手動追蹤源文件sir_util2.c在fscanf
調用拿出如下:
import subprocess
sir_util2_path = 'sir_util2.exe'
def sir_to_geotiff(infname, outfname, smin, smax, show_nodata):
show_nodata = int(show_nodata)
opt = 6 # convert to image
fmt = 3 # GeoTIFF
param = [infname, opt, fmt, smin, smax, show_nodata, outfname]
cmd = [sir_util2_path]
p = subprocess.Popen(cmd,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True)
out, err = p.communicate('\n'.join(map(str, param)))
if p.returncode != 0:
raise subprocess.CalledProcessError(p.returncode,
cmd,
output=(out,err))
我用一個小的測試程序,而不是編譯的原始來源,所以YMMV與實際的程序。
#include <stdio.h>
int main()
{
int num;
float fnum;
char str[250];
fscanf(stdin, "%s", str);
printf("input filename: %s\n", str);
fscanf(stdin, "%d", &num);
printf("menu option: %d\n", num);
fscanf(stdin, "%d", &num);
printf("output format: %d\n", num);
fscanf(stdin, "%f", &fnum);
printf("min saturation: %f\n", fnum);
fscanf(stdin, "%f", &fnum);
printf("max saturation: %f\n", fnum);
fscanf(stdin, "%d", &num);
printf("show no-data: %d\n", num);
fscanf(stdin, "%s", str);
printf("output filename: %s\n", str);
return 1; /* force error */
}
我強制它以非零返回碼退出。這讓我檢查CalledProcessError
:
try:
sir_to_geotiff('example.sir',
'example.tif',
30.0,
80.0,
True)
except subprocess.CalledProcessError as e:
print(e.output[0])
輸出:
input filename: example.sir
menu option: 6
output format: 3
min saturation: 30.000000
max saturation: 80.000000
show no-data: 1
output filename: example.tif
1.如由JF塞巴斯蒂安,程序能評論指出,但幸運的是這一個沒有,直接通過ReadConsoleInput
從控制檯輸入緩衝區讀取,這是由CRT _getch
函數調用的。
一個具體的例子會很有用。你有沒有讀過https://docs.python.org/3.4/library/subprocess.html的例子? –
是的,我在這個頁面上花了很多時間,但是我不明白大部分的內容。我正在使用的Windows可執行文件可以在http://www.scp.byu.edu/docs/geotiff.html下載第二段中的「windows可執行文件」鏈接。例如.sir文件(我需要轉換的類型)可以在http://www.scp.byu.edu/data/Quikscat/SIRv2/qusv/Ant.html下載,方法是單擊「A圖像「」SIR「專欄。 – Karen
作爲一種替代方法,編寫一個windows批處理腳本(使用python)。爲了實現自動化,請讓python讀取輸入文件名稱,創建輸出文件名並生成批處理文件。然後運行批處理文件。即使Windows批量允許<, >和|重定向。 –