繁体   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