[英]Better solution than if __name__ == '__main__' twice in Python script
我有多個使用 docopt 的 Python 腳本。
我的問題是這兩個腳本的可用選項略有不同 - 一個選項存在於一個腳本中,而不存在於另一個腳本中。
我在下面包含了一個最低限度的工作示例。
如果我運行:
python main.py --num=7 --name=John
腳本不會運行,因為 --name=John 也被傳遞到 module1.py,在那里它不是一個有效的選項。
對於我的實際腳本,在 docopt 解析參數后我有幾個導入,所以我不能簡單地將 docopt 調用移動到腳本的底部( if __name__ == '__main__':
)。 如果我這樣做,導入腳本中的導入永遠不會被調用,並且我會收到未定義的名稱錯誤。
我找到了一種解決方法,但我認為這根本不是一個好習慣。
我正在做的是添加:
if __name__ == '__main__':
arguments = docopt.docopt(__doc__, version=0.1)
就在import docopt
。
但是,我認為在腳本中包含其中兩個語句是不好的做法。 不過,我目前想不出任何其他解決方法。
有人可以提出更好的解決方案嗎? 提前致謝。
主文件
"""
main.py
Usage:
main.py [--num=<num>] [--name=<name>] [--lib=<lib-dir>]
main.py -h | --help
main.py --version
Options:
--num=<num> A number
--name=<name> A name
--lib=<lib-dir> Path to the directory containing lib
--version
"""
import docopt
arguments = docopt.docopt(__doc__, version=0.1)
library_path = os.path.abspath(arguments['--lib'])
sys.path.insert(1, library_path)
NUM = arguments['--num']
from other_file import x, y
from module1 import function
def main():
print 'In main()'
function()
print NUM
if __name__ == '__main__':
print '{} being executed directly'.format(__name__)
main()
模塊1.py:
"""
module1.py
Usage:
module1.py [--num=<num>] [--lib=<lib-dir>]
module1.py -h | --help
module1.py --version
Options:
--num=<num> A number
--lib=<lib-dir> Path to the directory containing lib
--version
"""
import docopt
arguments = docopt.docopt(__doc__, version=0.1)
library_path = os.path.abspath(arguments['--lib'])
sys.path.insert(1, library_path)
NUM = arguments['--num']
from other_file import z
def main():
print 'In main()'
print NUM
def function():
print 'In function in {}'.format(__name__)
# print NUM
if __name__ == '__main__':
print '{} being executed directly'.format(__name__)
main()
編輯:
我忘了提到 other_file 模塊有許多不同的版本。 因此,docopt 選項之一是文件的路徑。 然后將其添加到 sys.path 中,如下所示:
library_path = os.path.abspath(arguments['--lib'])
sys.path.insert(1, library_path)
為此,需要在全局范圍內導入 docopt 才能將 other_file 模塊的路徑添加到我的系統路徑中。
全局變量(下面的 NUM,在我的實際文件中調試)我可以沒有。
干凈的解決方案是重構您的代碼,使其不依賴於全局,無論是在main.py
還是module1.py
:
"""
main.py
Usage:
main.py [--num=<num>] [--name=<name>]
main.py -h | --help
main.py --version
Options:
--num=<num> A number
--name=<name> A name
--version
"""
from other_file import x, y
from module1 import function
def main(num):
print 'In main()'
function(num)
print num
if __name__ == '__main__':
import docopt
arguments = docopt.docopt(__doc__, version=0.1)
NUM = arguments['--num']
print '{} being executed directly'.format(__name__)
main(NUM)
和:
"""
module1.py
Usage:
module1.py [--num=<num>]
module1.py -h | --help
module1.py --version
Options:
--num=<num> A number
--version
"""
from other_file import z
def main(num):
print 'In main()'
print num
def function(num):
print 'In function in {}'.format(__name__)
print num
if __name__ == '__main__':
import docopt
arguments = docopt.docopt(__doc__, version=0.1)
NUM = arguments['--num']
print '{} being executed directly'.format(__name__)
main(NUM)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.