我阅读了文档和相当多的 stackoverflow 帖子,但没有找到明确的答案来解决我的疑问。
我想我明白命名空间包的用途。
我只对 Python>=3.3 和隐式命名空间包感兴趣 - 没有__init__.py.
命名空间包是否应该只包含其他包,或者模块(即.py文件)也“允许”?
命名空间包是否应该仅用作“容器”包,或者它们也可以包含在常规包中吗?
如果命名空间包只作为容器有意义,我想我可以声明,每当我有一个真正的包文件夹时,它的所有包含 python 模块的子文件夹也应该有__init__.py?
# this is fine
ns_package/
+-- real_package/
+-- __init.py__
# how about this?
real_package/
+-- __init.py__ # I have it for docs AND want to force the dir to be a real package
+-- ns_package/ # I would just like to avoid an empty __init__.py
+-- amodule.py
Run Code Online (Sandbox Code Playgroud)
我怀疑名称空间包仅作为容器才有意义,因为在其他情况下,我将无法使用不同路径中的其他内容扩展名称空间,因为父级是一个真正的包,必须在单个点中定义文件系统。因此我不会获得命名空间包的主要优势。
我问这个问题是因为在运行和导入模块(从项目的根目录)时,常规包内包含隐式名称空间包的情况工作得非常好。然而,它需要对安装的设置脚本进行一些调整,我想知道我一开始是否做了一些有缺陷的事情。
注意:我尝试使用隐式命名空间包主要不是因为我想利用它们的功能,而是因为我讨厌空 …
PEP 518介绍了该pyproject.toml文件,以及描述构建所需工具的部分:
[build-system]
requires = ["setuptools", "wheel", "numpy>=1.13"]
Run Code Online (Sandbox Code Playgroud)
在这里,我告诉构建系统(隐式的 setuptools)我需要安装这三个要求才能运行构建。(是的,我实际上确实需要 numpy 作为构建过程的一部分。)
当我运行时pip wheel,它知道在此文件中查找此部分,安装需求,然后构建轮子。但是 pip 无法创建一个sdist发行版(而且它的维护者似乎不愿意添加一个发行版),所以我需要运行python setup.py sdist. 这就是问题所在:setup.py 不知道它需要 numpy,并且构建失败。
是否有一种标准方法来安装需求,然后构建 sdist?特别是pip已经朝着构建隔离的方向发展了,那么这可以通过隔离来完成吗?如果做不到这一点,我可以创建自己的环境来进行一些隔离;那么,在某些环境中安装需求的最佳方法是什么?
python 打包(但不是 python)的新手,所以如果问题无处不在,请原谅。
尝试打包一个 python 模块(project-A ),它使用另一个目录( lib )中的一堆常见脚本。
对于如何将此lib目录包含在最终的包工件中遇到了困难。
setup.py、工作目录结构以及我如何规划最终的包安装结构如下所示。
还有几个问题——
/usr/lib/python3.4/site-packages/project_A/_lib. 喜欢这种方法。知道如何在 setup.py 中实现此目的setup.py(当前创建两个包)
setup(
name='project_A',
version='0.15',
# release is not supported in bdist rpm
#release=subprocess.check_output(["git", "rev-list", "--count", "--first-parent", "HEAD"]).rstrip(),
# if creating outside git
release="0.0.1",
author='foo',
author_email='hello@world.com',
url='http://www.hello.com',
long_description="README.txt",
#install_requires=['bottle','requests','supervisor'], # currently not working
#dependency_links = ['https://pypi.python.org/packages/source/b/bottle/bottle-0.12.8.tar.gz'],
packages=['project_A'],
include_package_data=True,
package_data={'images' : ['hello.gif']},
data_files=[
#('/etc/init.d/', ['project_Actl']), # some startup …Run Code Online (Sandbox Code Playgroud) 情况:
我创建了一个 python 包,其中使用以下库:
我的问题是,当我这样做时pip freeze,结果只返回版本值
我读过一些网站,他们说这是因为,例如,os 和 unittest 已经随 Python3.X 一起安装了。
问题:
注意:我刚刚开始尝试学习docker,所以我是一个初学者
目前,我正在使用诗歌和 pyenv 来制作我的 python 项目。我使用 pyenv 作为我的 python 版本,并使用诗歌来创建和管理我的 python 项目。但是,我也想使用 docker。那么,我怎样才能将这三个集成到一个Python项目中呢?
我有一个项目想要发布为针对两个 Python 版本(3.6 和 3.8)的包。
我的理解是:
pyenv.poetry创建与所选 Python 版本相对应的虚拟环境。pyproject.toml以指定 python 版本、管理依赖项以及使用此配置发布包。我不明白的是:如何为多个 Python 版本发布同一个包?我不可能是唯一一个拥有此用例的人,对吗?
pyproject.toml文件吗?(每个 python 版本和一组相应的依赖项都有一个......)做了更多的挖掘,我发现这个https://python-poetry.org/docs/dependency-specation/#multiple-constraints-dependencies看起来可能是相关的。
这是上面链接中的示例。
[tool.poetry.dependencies]
foo = [
{version = "<=1.9", python = "^2.7"},
{version = "^2.0", python = "^3.4"}
]
Run Code Online (Sandbox Code Playgroud)
poetry add我还发现你可以使用这样指定Python版本...
poetry add cleo --python 3.6.10
Run Code Online (Sandbox Code Playgroud)
这会像这样添加依赖项pyproject.toml......
cleo = {version = "^0.8.1", python = "3.6.10"}
Run Code Online (Sandbox Code Playgroud)
要去尝试一下,看看这是否有效。
我有一个通过 PyPI 分发的包,其中包含大量数据。PyPI 有 100MB 的限制,我想分发比这更多的数据。数据相当不变,因此在每次代码发布时不断将大量数据推送到 PyPI 似乎也很浪费。
相反,我更愿意分发最少的数据,并将大数据选项作为可选子包处理,例如pip install mypackage[lotsofdata]。这将由inextras_require的参数指定。实际的数据加载将是安装后操作,其中使用以下命令从服务器中提取数据setup()setup.pysetup.pywget。
我知道如何执行安装后操作
from setuptools.command.install import install
class InstallWrapper(install):
def run(self):
install.run(self)
# post install stuff goes here
# if [lotsofdata] option given, install it from server
Run Code Online (Sandbox Code Playgroud)
但我不知道如何访问用户的命令行以查看是否[lotsofdata]给出了该选项。
有人知道如何从安装时代码中获取此信息吗?
self是一个setuptools.command.install类的实例,该类继承自 ,distils.command.install该类继承自distils.cmd.Command。没有明显的方法或属性可以给我我正在寻找的东西,但是代码和文档并不那么容易理解。
这些括号参数的命名似乎不一致,例如“setuptools extras”、“install extras”、“package extras”。“额外”一词在整个 setuptools/distutils 世界中似乎有很多含义。
我已经poetry使用构建了一个包poetry build构建了一个包。
这是结构:
\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pyproject.toml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 some_project\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.py\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 options.py\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 helpers.py\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ...\n\nRun Code Online (Sandbox Code Playgroud)\n里面main.py我导入了两个模块
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pyproject.toml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 some_project\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.py\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 options.py\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 helpers.py\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ...\n\nRun Code Online (Sandbox Code Playgroud)\n它在本地使用 python 运行良好,但是当使用poetryand run 构建时会抛出此错误:
Traceback (most recent call last):\n File "/usr/local/bin/someproject", line 5, in <module>\n from some_project.main import main\n File "/usr/local/lib/python3.9/site-packages/some_project/main.py", line 4, in <module>\n from options import some_method\nModuleNotFoundError: No module named \'options\'\nRun Code Online (Sandbox Code Playgroud)\n还值得一提的是我的pyproject.toml: …
以前曾问过类似的问题,但这次我要求提供较新的 setuptools 配置文件 \xe2\x80\x94 setup.cfg。
考虑我的用例,我有一个包含多个相互依赖的 Python 包的项目。为了简单起见,我们说mypkg1取决于mypkg2:
mypkg1/\n mypkg1/\n setup.cfg\nmypkg2/\n mypkg2/\n setup.cfg\nRun Code Online (Sandbox Code Playgroud)\n如何编写setup.cfg文件以mypkg1使其依赖于 的本地副本mypkg2?
[metadata]\nname = mypkg1\nversion = 0.0.1\n\n[options]\npackages = find:\npython_requires = >= 3.7\ninstall_requires =\n ../mypkg2 # Does not work\nRun Code Online (Sandbox Code Playgroud)\n答案不能是分发mypkg2到包存储库(例如,PyPI)或某些 VCS 版本(例如,GitHub 版本),因为这些解决方案使包成为外部的而不是本地的。
相关问题
\n如何在Python中的setup.py中包含并安装本地依赖项?
\n这个问题适用于setup.pywhich 不适用于setup.cfg。
https://github.com/pypa/setuptools/issues/1951
\n讨论并不表示对此有任何支持,也不表示有任何计划将此作为一项功能。
\npython-packaging ×10
python ×6
setuptools ×5
pip ×3
pypi ×2
python-3.x ×2
boilerplate ×1
docker ×1
git ×1
gitlab ×1
package ×1
pyenv ×1
setup.py ×1