假設您有一個定義了多個函數的程序。每個函數都在一個單獨的for循環中調用。是否可以指定哪個函數應該通過命令行調用?Python - 指定要在命令行上使用的文件中的哪個函數
例子:
python prog.py -x <<<filname>>>
凡-x告訴蟒蛇去一個特定的循環,然後執行呼籲在for循環的功能?
謝謝, Seafoid。
假設您有一個定義了多個函數的程序。每個函數都在一個單獨的for循環中調用。是否可以指定哪個函數應該通過命令行調用?Python - 指定要在命令行上使用的文件中的哪個函數
例子:
python prog.py -x <<<filname>>>
凡-x告訴蟒蛇去一個特定的循環,然後執行呼籲在for循環的功能?
謝謝, Seafoid。
你想要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
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
是,內置的功能「EXEC ()'和'eval()'是你的朋友。只需將'()'添加到函數的名稱即可。但是,您應該想知道這是否是實際問題的最佳解決方案。技術上可行的事實並不意味着它也是最好的解決方案。使用'exec()'和'eval()'通常被認爲是'要避免的'。
小調:exec是一個聲明,而不是一個函數:http://docs.python。org/reference/simple_stmts.html#exec –
如果你只是想用這個發展,類似的情況在快速測試不同的功能,運行a(filename)
,您可以使用-c
命令行參數:
python -c 'import myfile; myfile.somefunc()'
您也可以執行'$ echo「somefunc()」| python -i myfile' –
一個非常簡單的方法如下:
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"
這不會讓我運行'sys.exit'和類似的東西嗎? – abyx
@abyx:'sys.exit'和類似的東西很容易通過使用前綴避免:'getattr(__ import __(__ name__),'f _'+ sys.argv [1],'print_help')()' – jfs