【问题标题】:Python3 preparing packages for PyPi not including submodulesPython3 为 PyPi 准备包,不包括子模块
【发布时间】:2019-02-06 19:32:18
【问题描述】:

注意事项:

  1. 我使用的是 Python v3.6
  2. 我已阅读有关Modules and Packages 的文档
  3. 我已阅读并通过Packaging project tutorial
  4. 我看过Sample Project(不同于教程项目)

我想做一个简单的包

myPackage/                      The project directory
    myPackage/                  Top-level package
      __init__.py               Initialize my package
      myClass.py                a file with a single class in it

    setup.py
    README.md
    ...
    dist/

myClass.py 在哪里

class myClass:
    __init__(self):
        print('here')

我的myPackage/__init__.py 文件就像演示一样

name = "myPackage"

我在pypi上成功搞定了,pip安装好了。

我可以import myPackage 但不像教程里的地方

example_pkg.name

有效,

myPackage.name

没有。

上面链接的示例项目没有详细说明 init.py 文件。

所以我的问题如下:

假设有人在模块和包的文档下有一个类似的包:

sound/                          Top-level package
      __init__.py               Initialize the sound package
      formats/                  Subpackage for file format conversions
              __init__.py
              wavread.py
              wavwrite.py
              aiffread.py
              aiffwrite.py
              auread.py
              auwrite.py
              ...
      effects/                  Subpackage for sound effects
              __init__.py
              echo.py
              surround.py
              reverse.py
              ...
      filters/                  Subpackage for filters
              __init__.py
              equalizer.py
              vocoder.py
              karaoke.py
              ...

实际文件结构在哪里(按照打包项目教程)

sound/
    sound/ (Top-level package)
        __init__.py
        ...
    dist/
    build/
    sound.egg/
    README.md
    ...

sound/__init__.py(或myPackage/__init__.py)中有什么内容,以便我可以导入它并访问其中的函数、子模块和类?

抱歉,我是 python 包装的菜鸟。

# contents of setup.py
import setuptools

with open("README.md", "r") as fh:
    long_description = fh.read()

setuptools.setup(
    name="progil",
    version="0.0.4",
    author="name",
    author_email="name@web",
    description="Progress In Line",
    long_description=long_description,
    long_description_content_type="text/markdown",
    url="https://pypi.org/project/progil/",
    packages=setuptools.find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
)

【问题讨论】:

  • 您的myClass.py 文件是否准确?您缺少 class 关键字。
  • @Chris 只是一个模型,我在问题中写道,所以请原谅这些错误。
  • 那么请edit 提问。我们无法知道哪些错误是相关的,哪些是我们应该忽略的。 “不起作用”是什么意思? myPackage.name 会引发AttributeError 吗?它是否包含None?一个空字符串?
  • @Chris 完成,NameError

标签: python python-3.x python-module pypi python-packaging


【解决方案1】:

使用我的项目 johnnydep 检查发行版的顶级导入名称:

# pip install johnnydep
$ johnnydep progil --fields name summary versions_available import_names
name    summary           versions_available    import_names
------  ----------------  --------------------  --------------
progil  Progress In Line  0.0.2, 0.0.3, 0.0.4   progril

你会踢自己。看起来你命名了分布:

progil

但是你在源代码中命名了包

progril

pip 安装 progil 和导入 progril 工作。您在设置时没有注意到,因为您使用了 find_packages(),实际上,分发名称没有理由需要与包名称匹配。

【讨论】:

  • 哦,不。新键盘和懒惰在发布前彻底检查。我很抱歉。跟进您能否将我链接到深入的(针对初学者)指南,了解如何处理主要包__init__.py 文件?如果我在子模块myClass.py 中有一个文件,其中只有class myClass,有没有办法从顶级模块导入它?
  • @SumNeuron 请先自己尝试一些显而易见的事情,如果它们不起作用,请提出一个新问题。 SO 试图不成为一个聊天网站。
猜你喜欢
  • 2016-07-25
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 2015-05-28
  • 2021-01-03
相关资源
最近更新 更多