簡體   English   中英

比在 Python 腳本中兩次 if __name__ == '__main__' 更好的解決方案

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM