繁体   English   中英

无法在python包中导入子模块

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM