2014-04-04 66 views
1

提前道歉 - 我對Python非常陌生,子流程文檔超出了我的頭腦!如何從Python中調用windows .exe文件,輸入參數並獲取文件輸出?

我有一個Windows可執行文件,將專有文件類型轉換爲Geotiff。當我運行可執行文件時,它會提示我輸入我想要使用的文件名,然後依次給出幾個選項 - 我喜歡做什麼(選項6),輸出文件類型(選項3)等等,最後以問我輸出文件名結束。我有大約2000張圖像進行轉換,所以我想自動執行此過程。

我試過幾個變化上

subprocess.Popen('executable, input file, arguments, outputfile') 

prog = subprocess.call('executable',stdout=PIPE,stdin=PIPE,stederr=PIPE) 
out, err = prog.communicate('filename\narguments\noutputfile') 

result = subprocess.check_output(['executable','inputfile','arguments','outputfile') 

在從本網站上的其他問題的建議。他們都沒有給我錯誤,但他們導致文件只是坐在那裏運行,什麼都不做。我應該使用哪些命令來運行帶有正確參數的可執行文件,並保存由Windows可執行文件生成的輸出Geotiff?

謝謝!

+0

一個具體的例子會很有用。你有沒有讀過https://docs.python.org/3.4/library/subprocess.html的例子? –

+0

是的,我在這個頁面上花了很多時間,但是我不明白大部分的內容。我正在使用的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

+0

作爲一種替代方法,編寫一個windows批處理腳本(使用python)。爲了實現自動化,請讓python讀取輸入文件名稱,創建輸出文件名並生成批處理文件。然後運行批處理文件。即使Windows批量允許<, >和|重定向。 –

回答

0

你可以簡單地使用os.system。下面是一個例子

from os import system 
    system("Path\to\Application.exe input file arguments outputfile") 

這是來自Python 2.7,但應該在3.x中工作。

2

一般的命令行實用程序可以接收其參數爲命令行參數,但sir_util2而不是從stdin經由C運行時功能fscanf 讀取用戶輸入。子過程便利函數call,check_callcheck_output不容易將輸入發送到stdin。直接使用Popen類,然後使用communicate

我手動追蹤源文件sir_util2.cfscanf調用拿出如下:

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函數調用的。

+1

+1表示通過stdin(而不是直接從控制檯('getch()'))接受輸入。你可以在p.communicate()之後使用'p.returncode'而不是'p.poll()'。沒有記錄'p.args'。 – jfs

+1

[現在記錄'p.args'](http://bugs.python.org/issue21353) – jfs

相關問題