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