在相对进口中不允许*的理由是什么?例如
from ..new_tool import *
Run Code Online (Sandbox Code Playgroud)
或直接进行相对导入:
import ..new_tool
Run Code Online (Sandbox Code Playgroud) 对我来说,这还不是很清楚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不赞成使用,还是最新的处理方式?
我最近开始尝试使用 Poetry 进行包和依赖管理,并且我仍在适应它与我使用 setuptools 的经验之间的差异。具体来说,我希望能帮助您理解如何处理以下场景。
我有一个数据文件,我想将其与存储在包子目录中的包捆绑在一起。使用 setup.py,我将在 setup.py 文件中指定文件和目录名称,然后使用 pkg_resources API 访问代码中的文件。
使用 Poetry 和 pyproject.toml 的等效方法是什么?
不要感到困惑,有大量关于安装 Python 包、如何导入生成的模块以及列出可用包的问题。但是,如果您没有pip--what-provides样式文件或Pipenv Pipfile ,则似乎没有与 pip 等效的选项。此问题与上一个问题类似,但要求提供父包,而不是其他元数据。也就是说,这些其他问题没有得到很多关注或得到许多接受的答案 - 例如。如何查找给定模块的 python 包元数据信息。就这样砥砺前行……requirements.txt
举例来说,有两个包(仅举几例)将安装名为的模块serial- 即pyserial和serial。因此,假设安装了其中一个软件包,我们可以使用 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) 我只想要这样的诗歌:
$ 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)
我还删除了.venv,poetry.lock然后$ poetry install。没有用。运行时错误很明显:
ImportError: email-validator is not installed, run `pip install pydantic[email]`
Run Code Online (Sandbox Code Playgroud)
我可以添加一个细节:它本身就是一种依赖项(在我遇到这个问题之前pydantic它是不存在的)。pyproject.toml
当你有一个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?
我可以在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应用程序,并且正在分支发行版本。我已经在公司服务器上设置了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包中组织源代码的帮助-我已经在网络上关注了一些教程(尤其是本教程),但该方法并没有按照说明以及我的想象进行。
我想创建一个名为的python包binaryio。它应该提供两个类命名BinaryReader和BinaryWriter我希望用户能够与进口
from binaryio import BinaryReader
from binaryio import BinaryWriter
Run Code Online (Sandbox Code Playgroud)
因此,我创建了我的存储库和包目录结构,如下所示:
BinaryReader类)BinaryWriter类)setuptools.setup调用)如您所见,这些类位于我习惯的单独文件中(来自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) 我需要在Lambda(Python 3.7)中使用自己的boto3版本。Lambda默认Python 3.7 env(1.9.42)中包含的版本由于某种原因不支持使用Textract。
为此,我根据指南进行了以下操作:
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 buildpip3 install -r requirements.txt -t build/cd buildzip -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使用的版本),因此我的导入没有覆盖它。
我只想简单地知道如何将我的自定义层导入到我的代码中!谢谢
编辑:尝试建议:
virtualenv python --python=python3.7source python/bin/activate 然后 pip3 install boto3zip -r boto3_layer.zip python/lib/boto3_layer.zip并将其添加到Lambda函数 …python python-3.x aws-lambda python-packaging aws-lambda-layers
python-packaging ×10
python ×8
python-3.x ×2
setup.py ×2
setuptools ×2
aws-lambda ×1
distutils ×1
pip ×1