簡體   English   中英

Python如何擁有一個我可以執行和導入的模塊

[英]Python how to have a module I can execute and import from

我有一個Python包mypackage ,其中包含一堆具有此目錄結構的模塊/類:

├── interface.py
├── mypackage/
|   └── __init__.py
|   └── classA.py
|   └── classB.py
|   └── ...

目前的使用情況是使用interface.py和一幫argparse標志:

python interface.py --foo --bar 

interface.py它使用mypackage實例化一堆類並運行它們的方法。 就像是:

from classA import ClassA

def interfaceMethod(foo, bar):
    a = ClassA(foo, ...)
    print(a.classMethod(bar, ...)

if args.foo: interfaceMethod(args.foo, args.bar)

當非python /程序員使用我的代碼時,這很有效。 但是我也希望能夠在他們的Python代碼中導入我的包並在interface.py運行相同的方法。 就像是:

import mypackage
print(mypackage.interfaceMethod(foo, bar)

  • 有沒有標准/最好的方法來做到這一點?
  • 注意 :我不認為用戶需要查看我的類結構,所以我寧願有一個面向類的用戶實現interface.py所有方法

解決方案1 (我不認為這是首選解決方案):

interface.py方法添加到__init__.py

# in __init__.py
from classA import ClassA

def interfaceMethod():
    a = ClassA(foo)
    print(a.classMethod(bar))

然后用戶可以在自己的代碼中執行以下操作(在interface.py看起來也非常相似):

import mypackage
mypackage.interfaceMethod()

解決方案2

創建一個mypackage類:

class MyPackage():
    self.classA = ClassA(...)
    self.classB = ClassB(...)

    def interfaceMethod():
        a = self.classA()

如果我創建這個類,我應該擔心包和類具有相同的名稱嗎? 我是否更改了包結構的層次結構以反映MyPackage是前向類?

一個好方法是使用setup.py並使用console_scripts

把你的interface.py放在你的包中,這個你的setup.py

setup(
    # other arguments here...
    entry_points={
        'console_scripts': [
            'script_name = my_package.interface:interfaceMethod',
        ],
    }
)

將您的interface.py更改為:

from classA import ClassA

def interfaceMethod(foo, bar):
    a = ClassA(foo, ...)
    print(a.classMethod(bar, ...)

if __name__ == '__main__':
    interfaceMethod(args.foo, args.bar)

使用Python setup.py install ,可以從命令行調用程序:

script_name --foo --bar 

有關詳細信息,請參閱完整文檔

你仍然可以用以下方法導入它:

from mypackage import interface
interface.interfaceMethod()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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