2009-12-19 41 views

回答

8

你想要sys模塊。

例如:

import sys 

#Functions 
def a(filename): pass 
def b(filename): pass 
def c(filename): pass 

#Function chooser 
func_arg = {"-a": a, "-b": b, "-c": c} 

#Do it 
if __name__ == "__main__": 
    func_arg[sys.argv[1]](sys.argv[2]) 

如果您運行python file.py -a filename

10

Python的成語爲主要切入點:

if __name__ == '__main__': 
    main() 

以任何功能應該先去更換main() ... (更多if name ...http://effbot.org/pyfaq/tutor-what-is-if-name-main-for.htm

如果要指定函數要通過命令行參數運行,只需手動或通過一些幫助程序檢查這些參數,例如http://docs.python.org/library/optparse.html,然後分支到所需的功能。

如果你不希望這樣的東西:

if options.function_to_call == 'mydesiredfunction': 
    mydesiredfunction() 

你可以採取的getattr優勢。

,最後使用globals另一個 '通用' 的做法(異常處理除外):

$ cat 1933407.py 

#!/usr/bin/env python 
# coding: utf-8 

import sys 

def first(): 
    print '1 of 9' 

def second(): 
    print '2 of 9' 

def seventh(): 
    print '7 of 9' 

if __name__ == '__main__': 
    globals()[sys.argv[1]]() 
在命令行

同時...

$ python 1933407.py second 
2 of 9 
+0

這不會讓我運行'sys.exit'和類似的東西嗎? – abyx

+1

@abyx:'sys.exit'和類似的東西很容易通過使用前綴避免:'getattr(__ import __(__ name__),'f _'+ sys.argv [1],'print_help')()' – jfs

0

是,內置的功能「EXEC ()'和'eval()'是你的朋友。只需將'()'添加到函數的名稱即可。但是,您應該想知道這是否是實際問題的最佳解決方案。技術上可行的事實並不意味着它也是最好的解決方案。使用'exec()'和'eval()'通常被認爲是'要避免的'。

+0

小調:exec是一個聲明,而不是一個函數:http://docs.python。org/reference/simple_stmts.html#exec –

4

如果你只是想用這個發展,類似的情況在快速測試不同的功能,運行a(filename),您可以使用-c命令行參數:

python -c 'import myfile; myfile.somefunc()' 
+0

您也可以執行'$ echo「somefunc()」| python -i myfile' –

1

一個非常簡單的方法如下:

import sys 

x_is_set=False 
for arg in sys.argv[1:]: 
    if arg == '-x': x_is_set=True 

if x_is_set: 
    print "-x is set" 
相關問題