代码之家  ›  专栏  ›  技术社区  ›  kjo

name参数的值setuptools.setup设置影响结果?

  •  0
  • kjo  · 技术社区  · 6 年前

    我最近收到了一个Python代码包,它是由一个学术实验室的研究生编写的,由一个Python脚本和大约六个单文件Python模块组成,由脚本使用。所有这些文件(脚本和模块)都在同一个目录中。

    pip 为了在虚拟环境中安装此代码,我尝试编写了一个 setup.py 我以前没做过的事。

    我让这个装置工作,我有一个模糊的理解,我把大部分的东西放在电脑里 设置.py 手段。

    唯一的例外是 name setuptools.setup 功能。

    pip install ,或此命令安装的代码是否有效?

    因此,我不知道该给这个参数赋予什么值,所以我只给出了一个听起来合理的名称,但没有尝试让它与代码库中的其他内容匹配。令我吃惊的是,什么也没坏!我的意思是 皮普 安装完成,没有错误,安装的代码在虚拟环境中正确执行。

    我做了一点实验,似乎我得到的任何值都是一样的。

    为了下面的描述,假设我给出 名称 whatever . 那么,据我所知,它唯一的效果就是 whatever.egg-info/ 创建(由 ?) 在与 设置.py 这个子目录包含两个包含字符串的文件 无论什么 在他们身上。

    其中一个文件是 whatever.egg-info/PKG-INFO ,其中包含行

    Name: whatever
    

    whatever.egg-info/SOURCES.txt ,其中列出了几个相对路径,包括一些以 .


    也许这是一个太简单的包装问题的价值 名称 有关系吗?

    问: 有人能给我一个简单的例子,其中一个错误的值 setuptools.setup设置 名称 参数将导致 pip安装 或者安装的代码失败?

    0 回复  |  直到 6 年前
        1
  •  3
  •   a_guest    6 年前

    序言: package 作为 一个Python模块,它可以包含子模块或递归的子包 分布 它可以捆绑一个或多个包(因此 setup(packages=...) 包裹 分布


    这个 name 参数确定如何在整个Python生态系统中标识您的发行版。它与发行版的实际布局(即其软件包)或这些软件包中定义的任何模块无关。

    The documentation

    re.IGNORECASE ): ^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$ .

    PEP 566 PEP 508 . 之前 PEP 345 松散指定的分发名称,没有任何限制。)

    除上述限制外,还有一些其他方面需要考虑:

    • PyPI _ - ,即。 hello_world hello-world PEP 541 更多信息)。
    • 最重要的是,您应该确保分发名称在您的工作环境中是唯一的,即它不会与其他分发名称冲突。假设您已经安装了 requests 在您的虚拟环境中进行项目,然后您决定命名您的发行版 requests 也。然后安装您的发行版将删除已存在的安装(即相应的软件包),您将无法再访问它。

    顶级包名称

    .
    ├── setup.py
    └── testpkg
        └── __init__.py
        └── a.py
    

    这个 setup.py 包含:

    from setuptools import setup
    
    setup(
        name='dist-a',
        version='1.0',
        packages=['testpkg'],
    )
    

    __init__.py a.py 只是空文件。安装该发行版后,您可以通过导入 testpkg (顶级软件包)。

    现在假设你有一个不同的分布 name='dist-b' 但使用相同的 packages=['testpkg'] b.py (代替 ). 所发生的是执行第二次安装 结束 已经存在的一个,即使用相同的物理目录(即 这恰好是两个发行版使用的软件包),可能会替换现有的模块,尽管两个发行版都实际安装了:

    $ pip freeze | grep dist-*
    dist-a @ file:///tmp/test-a
    dist-b @ file:///tmp/test-b
    $ python
    >>> import testpkg
    >>> import testpkg.a
    >>> import testpkg.b
    

    dist-a )也将删除第二个的内容:

    $ pip uninstall dist-a
    $ python
    >>> import testpkg
    ModuleNotFoundError: No module named 'testpkg'
    

    因此,除了发行名之外,还必须确保其顶级软件包与已安装项目的软件包不冲突。正是这些顶级包充当了发行版的名称空间。因此,选择一个与顶级包的名称相似的分发名称是一个好主意——通常这些名称是相同的。

        2
  •  4
  •   jdaz    6 年前

    Python packaging tutorial :

    • 名字是 你的包裹。这可以是任何名称,只要[它]只包含字母、数字、\和-。 它也不能已经被接受pypi.org网站 .

    pip install . 它独立于任何实际的包代码,并且不被任何实际的包代码使用。

    如果你用过 whatever pip install whatever 安装你的软件包,他们可以在 https://pypi.org/project/whatever/ (事实上,它已经被拿走了!)。

    当你跑的时候 setup.py sdist bdist_wheel ,你会得到一个 tar.gz 源存档和 whl 文件中提供的名称 setuptools.setup . 然后,您可以使用它们在本地安装软件包,或者在PyPI之外以任何方式分发它们。

    即使在本地,包名也必须是唯一的,以避免冲突。如果您尝试安装两个具有相同名称和版本号的软件包,您将得到一个 Requirement already satisfied pip 将退出。如果版本号不匹配,将卸载现有软件包,新软件包将替换它。

        3
  •  3
  •   LightCC    6 年前

    该名称基本上是元数据,它不会直接影响代码,除非您将元数据拉入,或者使用PyInstaller之类的工具将其构建到exe中。

    my_project.egg-info 文件夹中充满了其他元数据,如描述和版本控制。例如,您可以将当前版本信息存储在 PKG-INFO 文件和使用:

    1. pbr(一个setuptools插件,可以很好地与Git一起工作-更多信息请参阅 this Q&A )
    2. 或其他工具,如较新的内置导入lib.metadata包装( see Python 3.8 docs

    从脚本中以编程方式访问该版本信息(如字符串、元组等)

    其他元数据(如描述、包需求等)也可用,而 Python Package User Guide 其他教程通常会突出显示直接填充上传到PyPI所需信息的元数据,如果您不打算公开发布,可以随意填充所需内容,而忽略其余内容(或者自己滚动)。