2011-10-07 313 views
10

我有我的python文件,名爲convertImage.py,在文件內部我有一個腳本將圖像轉換爲我喜歡的,整個轉換腳本設置在名爲convertFile(文件名)從命令行執行python腳本,Linux

現在我的問題是我需要從linux命令行執行這個python腳本,同時傳遞convertFile(fileName)函數。

例如:

linux user$: python convertImage.py convertFile(fileName) 

這應該執行python腳本傳遞適當的功能。

例如:

def convertFile(fileName): 

    import os, sys 
    import Image 
    import string 

    splitName = string.split(fileName, "_") 
    endName = splitName[2] 
    splitTwo = string.split(endName, ".") 
    userFolder = splitTwo[0] 

    imageFile = "/var/www/uploads/tmp/"+fileName 

    ...rest of the script... 

    return 

什麼是執行這個python腳本並正確傳遞文件名從LIUNX命令行功能的正確方法?

感謝先進

+2

有沒有這樣的事情。解析'sys.argv'列表並選擇正確的操作。檢查'argparse'模塊 – JBernardo

+0

正如S.Lott所提到的,''是一種非常常見的風格。用戶最好擁有命令名稱,而不是內部實現的知識。並且使用括號(需要在bash中轉義)作爲語法的必需部分只是意味着什麼。 – Cascabel

+0

括號僅僅是出於示例的原因,但我讚賞所有的幫助,並得到它使用sys.argv – knittledan

回答

21

if __name__ == "__main__": 
    command= " ".join(sys.argv[1:]) 
    eval(command) 

這將工作。但它非常危險。

你真的需要思考你的命令行語法是什麼。而且您需要考慮爲什麼要打破用於爲程序指定參數的早已建立的Linux標準。

例如,您應該考慮在您的示例中刪除無用的()。相反,讓它成爲這個。

python convertImage.py convertFile fileName 

然後,你可以 - 用很少的工作 - 使用​​獲得標準的Linux命令行語法中的命令(「convertFile」)和參數(「文件名」)和工作。

function_map = { 
    'convertFile': convertFile, 
    'conv': convertFile, 
} 
parser = argparse.ArgumentParser() 
parser.add_argument('command', nargs=1) 
parser.add_argument('fileName', nargs='+') 
args= parser.parse_args() 
function = function_map[args.command] 
function(args.fileName) 
+2

簡單回答X的主要問題是使用Y – Thomas

+0

@ S.Lott這個函數的用途是什麼?爲什麼它有兩個命令的鍵? – Helk

4

快速和骯髒的方式:

linux user$: python convertImage.py convertFile fileName 

,然後在convertImage.py

if __name__ == '__main__': 
    import sys 
    function = getattr(sys.modules[__name__], sys.argv[1]) 
    filename = sys.argv[2] 
    function(filename) 

一個更復雜的方法將使用argparse(2.7或3.2以上版本)或optparse

+0

argparse也在2.7 –

+0

@PetrViktorin:謝謝,更新。 –

0

創建腳本的頂層可執行部分,它分析命令行參數(S),然後將它傳遞給你的函數調用,就像這樣:

import os, sys 
#import Image 
import string 


def convertFile(fileName): 
    splitName = string.split(fileName, "_") 
    endName = splitName[2] 
    splitTwo = string.split(endName, ".") 
    userFolder = splitTwo[0] 

    imageFile = "/var/www/uploads/tmp/"+fileName 

    print imageFile  # (rest of the script) 

    return 


if __name__ == '__main__': 
    filename = sys.argv[1] 
    convertFile(filename) 

然後,從外殼,

$ convertImage.py the_image_file.png 
/var/www/uploads/tmp/the_image_file.png 
+0

-1不建議使用argparse – Kimvais

+0

這是否需要hashbang? –