我有一个Python软件包easy_install
,其中包含具有此目录结构的一堆模块/类:
venvs
当前的用例是将mypackage
与一堆├── interface.py
├── mypackage/
| └── __init__.py
| └── classA.py
| └── classB.py
| └── ...
标志一起使用:
interface.py
在argparse
内部,它使用python interface.py --foo --bar
实例化了一堆类并运行它们的方法。像这样:
interface.py
当让非python /程序员使用我的代码时,这很好用。但我也希望能够将我的包导入其Python代码中,并在mypackage
中运行相同的方法。像这样:
from classA import ClassA
def interfaceMethod(foo, bar):
a = ClassA(foo, ...)
print(a.classMethod(bar, ...)
if args.foo: interfaceMethod(args.foo, args.bar)
问题
interface.py
解决方案1 (我认为这不是首选的解决方案):
将方法从import mypackage
print(mypackage.interfaceMethod(foo, bar)
添加到interface.py
:
interface.py
然后用户可以使用自己的代码执行以下操作(在__init__.py
中看起来也非常相似):
# in __init__.py
from classA import ClassA
def interfaceMethod():
a = ClassA(foo)
print(a.classMethod(bar))
解决方案2 :
创建一个interface.py
类:
import mypackage
mypackage.interfaceMethod()
如果我创建此类,是否应该担心包和类的名称相同?我是否更改包结构的层次结构以反映mypackage
是面向前方的类?
答案 0 :(得分:0)
一种好方法是使用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
有关详细信息,请参见full documentation。
您仍然可以通过以下方式导入它:
from mypackage import interface
interface.interfaceMethod()