用单个包拆分python代码库

时间:2017-10-23 18:21:30

标签: python setuptools python-packaging

我有一些python代码,包括服务器,客户端和公共代码,我试图将其拆分为共享包命名空间的单独项目。我已经看到了一些类似的问题,但它们似乎指的是单独但有名称冲突的软件包。

我正在尝试使用

制作一个简单的示例
func checkNotificationStatus() {
        let current = UNUserNotificationCenter.current()

        current.getNotificationSettings(completionHandler: { (settings) in
            if settings.authorizationStatus == .notDetermined {
                // Notification permission has not been asked yet, go for it!
                print("Not yet asked for permission")
            }

            if settings.authorizationStatus == .denied {
                // Notification permission was previously denied, go to settings & privacy to re-enable
                print("Permission denied")
            }

            if settings.authorizationStatus == .authorized {
                // Notification permission was already granted
                print("Permission Granted")

            }
        })
    }

一个/ setup.py

a
├── pkg
│   ├── a.py
│   ├── __init__.py
└── setup.py
b
├── pkg
│   ├── b.py
│   ├── __init__.py
└── setup.py

a.py

import setuptools

setuptools.setup(
    name='pkg_a',
    packages=setuptools.find_packages(),
    entry_points={
        'console_scripts': [
            'pkga=pkg.a:main'
        ]
    }
)

请注意,def main(): print('Module A') b/setup.pyb.py更改为a的引用相同。

如果我在每个目录中都执行了b,则命令pip install .pka都有效,但pkgbimport pkg.a仅适用于最后一个安装。 import pkg.ba.py以及一个空的b.py都位于__init__.py

有没有办法让这个设置工作?尝试跨包共享包名是不是一个坏主意?

1 个答案:

答案 0 :(得分:3)

您应该pkg 命名空间包

虽然官方建议使用基于pkgutil的第一种方法,但第二种方法基于setuptools& pkg_resources被广泛使用(出于历史原因),如果您注入其他库的现有旧名称空间,则需要{。}}。

对于setuptools方式,请将此行放入两个库中的pkg/__init__.py

__import__('pkg_resources').declare_namespace(__name__)

setup.py

中声明它们
setup(
    # ...
    namespace_packages=['pkg']
)

完成。