我有一些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.py
与b.py
更改为a
的引用相同。
如果我在每个目录中都执行了b
,则命令pip install .
和pka
都有效,但pkgb
或import pkg.a
仅适用于最后一个安装。 import pkg.b
和a.py
以及一个空的b.py
都位于__init__.py
。
有没有办法让这个设置工作?尝试跨包共享包名是不是一个坏主意?
答案 0 :(得分:3)
您应该pkg
命名空间包:
虽然官方建议使用基于pkgutil
的第一种方法,但第二种方法基于setuptools
& pkg_resources
被广泛使用(出于历史原因),如果您注入其他库的现有旧名称空间,则需要{。}}。
对于setuptools方式,请将此行放入两个库中的pkg/__init__.py
:
__import__('pkg_resources').declare_namespace(__name__)
在setup.py
:
setup(
# ...
namespace_packages=['pkg']
)
完成。