标签: python-packaging

python:在相对导入中不允许*的原因是什么?

在相对进口中不允许*的理由是什么?例如

from ..new_tool import *
Run Code Online (Sandbox Code Playgroud)

或直接进行相对导入:

import ..new_tool
Run Code Online (Sandbox Code Playgroud)

python relative-path python-packaging

8
推荐指数
1
解决办法
162
查看次数

setup.cfg是否已弃用?

对我来说,这还不是很清楚setup.cfg。我正在寻找有关PEP 508环境标志物的其他问题的解决方案,这让我感到非常困惑。

在我看来,这setup.cfg是对的改进setup.py,因为它是声明性的,不涉及运行任意代码以使程序包可安装,使分发恶意Python程序包更加困难,使运行Python程序包注册表更容易。

因此,setuptools文档中这里提到了setuptools在30.3.0 (8 Dec 2016)版本中对setup.cfg的支持,这是最近的。所以,这必须是新事物,对吗?

不完全的。至少从2.6开始就有很长一段时间的distutils支持setup.cfg。已经9年了。

同时,在这里的wheel文档中,据说setup.cfg现在已弃用,最好通过extras_require参数提供环境标记。而且它提到了setuptools,因此它与可能不赞成使用的distutils风格无关setup.cfg

那么,实际上是怎么回事?是setup.cfg不赞成使用,还是最新的处理方式?

python distutils setuptools python-3.x python-packaging

8
推荐指数
2
解决办法
1289
查看次数

访问基于 Python Poetry 的包的数据资源

我最近开始尝试使用 Poetry 进行包和依赖管理,并且我仍在适应它与我使用 setuptools 的经验之间的差异。具体来说,我希望能帮助您理解如何处理以下场景。

我有一个数据文件,我想将其与存储在包子目录中的包捆绑在一起。使用 setup.py,我将在 setup.py 文件中指定文件和目录名称,然后使用 pkg_resources API 访问代码中的文件。

使用 Poetry 和 pyproject.toml 的等效方法是什么?

python-install python-packaging python-poetry

8
推荐指数
1
解决办法
5820
查看次数

查找哪个Python包提供了特定的导入模块

不要感到困惑,有大量关于安装 Python 包、如何导入生成的模块以及列出可用包的问题。但是,如果您没有pip--what-provides样式文件Pipenv Pipfile ,则似乎没有与 pip 等效的选项。此问题与上一个问题类似,但要求提供父包,而不是其他元数据。也就是说,这些其他问题没有得到很多关注或得到许多接受的答案 - 例如。如何查找给定模块的 python 包元数据信息。就这样砥砺前行……requirements.txt

举例来说,有两个包(仅举几例)将安装名为的模块serial- 即pyserialserial。因此,假设安装了其中一个软件包,我们可以使用 pip list 找到它:

python3 -m pip list | grep serial
Run Code Online (Sandbox Code Playgroud)

但是,如果包的名称与模块的名称不匹配,或者您只是想找出要安装的包(在旧服务器或开发计算机上工作),就会出现问题。

您可以检查导入模块的路径 - 这可以给您提供线索。但继续这个例子......

>>> import serial
>>> print(serial.__file__)
/usr/lib/python3.6/site-packages/serial/__init__.py
Run Code Online (Sandbox Code Playgroud)

它位于一个serial目录中,但实际上只安装了pyserial ,而不是serial

>>> import serial
>>> print(serial.__file__)
/usr/lib/python3.6/site-packages/serial/__init__.py
Run Code Online (Sandbox Code Playgroud)

我能想到的最接近的是生成一个可能在依赖子文件上失败的requirements.txtvia (就像我所做的那样),或者通过Pipenvpipreqs ./反向检查依赖关系(这会带来一整套新问题来完成所有设置):

> python3 -m pip list | grep serial
pyserial …
Run Code Online (Sandbox Code Playgroud)

python pip python-import python-importlib python-packaging

8
推荐指数
1
解决办法
2128
查看次数

Python诗歌,安装可选依赖项

我只想要这样的诗歌:

$ pip install pydantic[email]
Run Code Online (Sandbox Code Playgroud)

我已阅读所有相关帖子。现在我的pyproject.toml看起来像这样(我也尝试了其他所有方法):

[tool.poetry.dependencies]
pydantic = {version = "*", optional = true, extras = ["email"]}
...

[tool.poetry.extras]
email = ["pydantic"]
Run Code Online (Sandbox Code Playgroud)

我还删除了.venvpoetry.lock然后$ poetry install。没有用。运行时错误很明显:

ImportError: email-validator is not installed, run `pip install pydantic[email]`
Run Code Online (Sandbox Code Playgroud)

我可以添加一个细节:它本身就是一种依赖项(在我遇到这个问题之前pydantic它是不存在的)。pyproject.toml

python-packaging python-poetry

8
推荐指数
1
解决办法
9109
查看次数

如何在命令行 (Python) 获取 `setup.cfg` 元数据

当你有一个setup.py文件时,你可以通过以下命令获取包的名称:

C:\some\dir>python setup.py --name
Run Code Online (Sandbox Code Playgroud)

这会将包的名称打印到命令行。

为了遵循最佳实践,我试图setup.py通过将所有内容放入其中来迁移setup.cfg,因为以前的所有内容setup.py都是静态内容。

但我们的构建管道依赖于能够调用python setup.py --name. 我希望以不需要创建setup.py文件的方式重写管道。

setup.cfg当您有文件但没有文件时,有没有办法获取包的名称setup.py

python setuptools setup.py python-packaging

8
推荐指数
2
解决办法
3097
查看次数

setup.py-配置私人/商业项目

我可以在setup.py项目配置文件中放些什么,以告诉开发人员该项目是私有/商业应用程序/库。

目前我设定:

setup(
    name='MyProject',
    version='0.1.0',
    license='(c) My Company',
    ...
)
Run Code Online (Sandbox Code Playgroud)

有最佳做法吗?

注意:

如今,大多数项目都是开源的,并且遵循许可证模型。但是,当您从事该行业时,软件是私有的。我的公司与离岸公司合作,这些公司可能不知道软件可以是私有的。因此,我想通过在setup.py文件中指定它来引起他们的注意。这就是为什么我在寻找最佳实践的原因。

结论/解决方案

对于私人/专有应用程序,我将遵循rth的建议

  • 将许可证属性设置为“专有”,
  • 添加分类器“许可证::其他/专有许可证”,
  • 并可能添加一个LICENSE文件。

模板将是这样的:

setup(
    name='MyProject',
    version='0.1.0',
    license="Proprietary",
    classifiers=[
        'License :: Other/Proprietary License',
        ...
    ],
    ...
)
Run Code Online (Sandbox Code Playgroud)

一种替代方法是设置“非开源”,如cookiecutter-pypackage模板中定义的那样

python python-packaging

7
推荐指数
1
解决办法
3280
查看次数

我应该如何在setup.py脚本中处理导入第三方库?

我正在开发Python应用程序,并且正在分支发行版本。我已经在公司服务器上设置了PyPI服务器,并且已经将软件包的源代码分发复制到了该服务器上。

我检查了软件包是否托管在服务器上,然后尝试将其安装在本地开发计算机上。我最终得到以下输出:

$ pip3 install --trusted-host 172.16.1.92 -i http://172.16.1.92:5001/simple/ <my-package>
Collecting <my-package>
  Downloading http://172.16.1.92:5001/packages/<my-package>-0.2.0.zip
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "C:\Users\<me>\AppData\Local\Temp\pip-build-ubb3jkpr\<my-package>\setup.py", line 9, in <module>
        import appdirs
    ModuleNotFoundError: No module named 'appdirs'

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in C:\Users\<me>\AppData\Local\Temp\pip-build-ubb3jkpr\<my-package>\
Run Code Online (Sandbox Code Playgroud)

其原因是,我试图导入第三方库appdirs在我setup.py,这是我有必要计算data_files参数setup()

try:
    from setuptools import setup
except ImportError:
    from distutils.core import setup

import os
from …
Run Code Online (Sandbox Code Playgroud)

python setup.py python-packaging

7
推荐指数
1
解决办法
803
查看次数

__init__.py在同一目录中找不到模块

我需要有关如何在python包中组织源代码的帮助-我已经在网络上关注了一些教程(尤其是教程),但该方法并没有按照说明以及我的想象进行。

我想创建一个名为的python包binaryio。它应该提供两个类命名BinaryReaderBinaryWriter我希望用户能够与进口

from binaryio import BinaryReader
from binaryio import BinaryWriter
Run Code Online (Sandbox Code Playgroud)

因此,我创建了我的存储库和包目录结构,如下所示:

  • binaryio(存储库根)
    • binaryio(软件包根)
      • __init __py(以下简称)
      • binaryreader.py(包含BinaryReader类)
      • binarywriter.py(包含BinaryWriter类)
    • setup.py(包含setuptools.setup调用)
    • .gitignoreREADME.md许可证,...

如您所见,这些类位于我习惯的单独文件中(来自C#背景)。由于模块是Python中的“单元”,我不确定这是否是一个好主意-但对我来说,将所有类限制在一个大文件中似乎并不合逻辑。

__init__.py看起来如下导入这些类,从而(据我所知)from binaryio import BinaryReader以后可以为用户提供导入:

from binaryreader import BinaryReader
from binarywriter import BinaryWriter
Run Code Online (Sandbox Code Playgroud)

但是,当我在本地安装该软件包(似乎工作正常)并尝试到时import binaryio,出现以下错误:

>>> import binaryio
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "D:\Projects\Git\binaryio\binaryio\__init__.py", …
Run Code Online (Sandbox Code Playgroud)

python python-packaging

7
推荐指数
2
解决办法
5980
查看次数

如何在AWS Lambda函数中降级boto3版本

我需要在Lambda(Python 3.7)中使用自己的boto3版本。Lambda默认Python 3.7 env(1.9.42)中包含的版本由于某种原因不支持使用Textract。

为此,我根据指南进行了以下操作:

  1. 使用以下命令创建自定义程序包:
    • pip freeze > requirements.txt 这将产生此文件:
# requirements.txt
boto3==1.9.138
botocore==1.12.138
docutils==0.14
jmespath==0.9.4
python-dateutil==2.8.0
s3transfer==0.2.0
six==1.12.0
urllib3==1.24.2
Run Code Online (Sandbox Code Playgroud)
  • mkdir build
  • pip3 install -r requirements.txt -t build/
  • cd build
  • zip -r ../boto3_layer.zip .

然后,我使用GUI上传新的Lambda层(称为boto3Layer)。然后,将图层成功添加到Lambda函数中。

问题是,我不知道如何使用内联代码编辑器将所述层导入到我的代码中。

我有以下代码:

...
from boto3_layer as boto3
...
log.info(boto3)
Run Code Online (Sandbox Code Playgroud)

我得到错误 "errorMessage": "Unable to import module 'lambda_function': No module named 'boto3_layer'"

我也尝试导入just boto3,但是确认它是错误的版本(这是Lambda使用的版本),因此我的导入没有覆盖它。

我只想简单地知道如何将我的自定义层导入到我的代码中!谢谢

编辑:尝试建议:

对于尝试完成相同任务的其他用户:

  1. virtualenv python --python=python3.7
  2. source python/bin/activate 然后 pip3 install boto3
  3. zip -r boto3_layer.zip python/lib/
  4. 使用创建新的Lambda层boto3_layer.zip并将其添加到Lambda函数 …

python python-3.x aws-lambda python-packaging aws-lambda-layers

7
推荐指数
1
解决办法
800
查看次数