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