Python如何拥有一个我可以执行和导入的模块

时间:2018-08-03 19:36:16

标签: python oop

我有一个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是面向前方的类?

1 个答案:

答案 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()