[英]Cant import submodules in python package
我有一个可以独立使用的 python 包。 但是,当我使用 pip 将它安装到站点包时,我失去了导入子模块的能力。
我的包裹是这样的:
mypackage
mypackage
__init__.py
mymodule.py
moduledir
__init__.py
mysubmodule.py
setup.py
如果我的 pythonpath 上有这个包,我就可以很好地使用它。 但是当我使用 pip 将它安装到站点包时,我无法导入子模块。
from mypackage import mymodule # works fine
from mypackage.moduledir import mysubmodule # ModuleNotFoundError: No module named when installed to site-packages, works fine when on pythonpath
这里发生了什么? 如何更改它以便我可以导入子模块?
另外,我确定这在某处得到了回答,但是我一生都无法在 google 或 SO 上找到它。 如果它微不足道,我很抱歉,我只是在谷歌上搜索了错误的条款。
编辑:这是我要求的 setup.py。
from setuptools import setup
setup(name='mypackage',
version='0.1',
description='mypackage',
url='https://gitlab.com/ericksonla/mypackage',
author='ericksonla',
author_email='ericksonla@ericksonla.com',
license='',
packages=['mypackage'],
install_requires=[],
zip_safe=False)
我需要将子模块添加到setup.py的软件包列表中:
# setup.py
from setuptools import setup
setup(name='mypackage',
version='0.1',
description='mypackage',
url='https://gitlab.com/ericksonla/mypackage',
author='ericksonla',
author_email='ericksonla@ericksonla.com',
license='',
packages=['mypackage, 'mypackage.moduledir'],
install_requires=[],
zip_safe=False)
我仍然不太确定为什么我需要向下导入一个级别,而无需进一步导入。
我很高兴看到您找到了setuptools
您的setuptools
解决方案。 我最近了解到的setuptools
中的一个替代方法是setuptools.find_packages()
函数。 使用正确的参数, setuptools.find_packages()
可以发现并添加包的任意数量的子模块,人们可能会发现这对于增大大小和添加子模块的包很有用。
如果您在本示例中使用此方法,您的setup.py
文件可能如下所示:
# setup.py
from setuptools import setup, find_packages
setup(name='mypackage',
version='0.1',
description='mypackage',
url='https://gitlab.com/ericksonla/mypackage',
author='ericksonla',
author_email='ericksonla@ericksonla.com',
license='',
packages=find_packages(),
install_requires=[],
zip_safe=False)
然而,对于更复杂的用例,这种灵活性带来了一些警告。
例如,您当前的包结构为您的源代码模块提供了与包本身相同的名称( mypackage
的代码存储在目录mypackage
)。 如果您要使用不同的目录结构,例如
mypackage
src
mypackage
__init__.py
mymodule.py
moduledir
__init__.py
mysubmodule.py
tests
mytest.py
setup.py
源代码在src
子目录中的位置,我认为您需要在setup.py
文件中指定find_packages
的“where”参数并添加package_dir
参数以告诉setuptools.setup()
它应该映射src
的内容到您的包名称,而不是src
子模块:
# setup.py
from setuptools import setup, find_packages
setup(name='mypackage',
version='0.1',
description='mypackage',
url='https://gitlab.com/ericksonla/mypackage',
author='ericksonla',
author_email='ericksonla@ericksonla.com',
license='',
packages=find_packages('src'),
package_dir={'': 'src'}
install_requires=[],
zip_safe=False)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.