标签: python-packaging

Python setuptools:打包根目录(每个包不需要子目录)

我需要将一个包写入存储库,但它是一个小型快速包,因此我认为不需要将文件放入子目录中。我只是想要:

import mypkg.module1
Run Code Online (Sandbox Code Playgroud)

具有目录结构

root_folder/
    - setup.py
    - __init__.py  # the init for package "mypkg" (empty)
    - module1.py
Run Code Online (Sandbox Code Playgroud)

我不想被限制增加文件夹层次结构,如下所示:

root_folder/
    - setup.py
    - __init__.py  # the init for package "mypkg" (empty)
    - module1.py
Run Code Online (Sandbox Code Playgroud)
root_folder/
    - setup.py
    - mypkg/  # WHY would I do that for 1 module??
        - __init__.py
        - module1.py
Run Code Online (Sandbox Code Playgroud)

但结果是,import mypkg失败了,并且import module1工作了,而不是期望的import mypkg.module1

我发现了这个问题,但“只需将 setup.py 向上移动一个文件夹”的答案不适合我。

在此处找到设置参数文档后,我尝试定义一个命名空间包:

# Content of setup.py
from setuptools import setup

setup(name='MyPkg',
      packages=['mypkg'] …
Run Code Online (Sandbox Code Playgroud)

python setuptools python-packaging

6
推荐指数
1
解决办法
3633
查看次数

是否可以使 `__init__.py` 中的导入对 python `help()` 命令可见?

假设我有一个模块:

mymodule/example.py

def add_one(number):
    return number + 1
Run Code Online (Sandbox Code Playgroud)

mymodule/__init__.py

from .example import *

foo = "FOO"

def bar():
    return 1
Run Code Online (Sandbox Code Playgroud)

现在我在 的根部看到该函数mymodule

>>> import mymodule
>>> mymodule.add_one(3)
4
>>> mymodule.foo
'FOO'
Run Code Online (Sandbox Code Playgroud)

另外,我看到add_one通过dir以下方式导入example

>>> dir(mymodule)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'add_one', 'bar', 'example', 'foo']
Run Code Online (Sandbox Code Playgroud)

但是当我输入时,help(mymodule)我只看到example,foobar,但看不到导入的add_one

Help on package mymodule:

NAME
    mymodule

PACKAGE CONTENTS
    example

FUNCTIONS
    bar() …
Run Code Online (Sandbox Code Playgroud)

python python-import python-packaging

6
推荐指数
1
解决办法
118
查看次数

如何使用诗歌添加私人存储库?

使用Artifactory(https://cloud.google.com/artifact-registry)我打算添加对诗歌的依赖(https://python-poetry.org/docs/repositories/)。

我可以使用命令安装:(pip install --index-url https://us-central1-python.pkg.dev/<PROJECT_ID>/<SOME_LIB_REPO>/simple/ <PACKAGE_NAME>使用 keyrings.google-artifactregistry-auth 进行身份验证)

我打算使用 POETRY 来管理我的依赖项。我不知道使用诗歌是否会增加这种依赖性。poetry add --source <PACKAGE_NAME> https://us-central1-python.pkg.dev/<PROJECT_ID>/<SOME_LIB_REPO>我收到此错误:

poetry update
Updating dependencies
Resolving dependencies... (0.9s)

  RepositoryError

  401 Client Error: Unauthorized for url: https://us-central1-python.pkg.dev/<PROJECT_ID>/<SOME_LIB_REPO>/simple/pytest/
Run Code Online (Sandbox Code Playgroud)

我的 pyproject.toml

...

[[tool.poetry.source]]
name = "SOME_LIB"
url = " https://us-central1-python.pkg.dev/<PROJECT_ID>/<SOME_LIB_REPO>/simple/"
secondary = true
Run Code Online (Sandbox Code Playgroud)

这里有如何使用 PIP/VIRTUALENV 进行配置的详细信息:https://cloud.google.com/artifact-registry/docs/python/authentication但没有有关 Poetry 的详细信息。

您对此有什么建议吗?

python python-packaging python-poetry google-artifact-registry

6
推荐指数
1
解决办法
1090
查看次数

如何在 pyproject.toml 中指定 setuptools 入口点

我有一个像这样的 setup.py :

#!/usr/bin/env python

from setuptools import setup, find_packages

setup(
    name="myproject",
    package_dir={"": "src"},
    packages=find_packages("src"),
    entry_points={
        "console_scripts": [
            "my-script = myproject.myscript:entrypoint",
        ],
    },
)
Run Code Online (Sandbox Code Playgroud)

如何entry_points使用 setuptools 在 pyproject.toml 中编写该配置?

我猜测类似这样的事情,继续setuptools 的 pyproject.toml 文档,它说我需要在引用入口点的文档之后使用“INI 格式” ,但它似乎没有给出示例,我的猜测关于如何将 setuptools 语法与 pyproject.toml 语法结合起来是错误的(我从pip install -e .该报告中得到了回溯pip._vendor.tomli.TOMLDecodeError: Invalid value,指向entry-pointspyproject.toml 中的行):

[build-system]
requires = ["setuptools", "setuptools-scm"]
build-backend = "setuptools.build_meta"

[metadata]
name = "myproject"

[tool.setuptools]
package-dir = {"" = "src"}

[tool.setuptools.packages.find]
where = ["src"]

[tool.setuptools.dynamic]
entry-points …
Run Code Online (Sandbox Code Playgroud)

python program-entry-point setuptools python-packaging pyproject.toml

6
推荐指数
1
解决办法
4760
查看次数

Poetry add pkg 得到“HTTPResponse.__init__() 得到了意外的关键字参数‘strict’”

我使用 conda 使用 python 3.10.9 创建一个新环境。我使用 pip 安装了诗歌,在添加几个包后,该poetry add pkg命令不起作用并出现错误消息:

HTTPResponse.__init__() got an unexpected keyword argument 'strict'
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我用谷歌搜索了这个问题,但没有答案,如何解决?

让诗歌添加命令正常工作

python python-packaging python-poetry

6
推荐指数
1
解决办法
2090
查看次数

devpi和pypi服务器之间的区别

在这里有一个简短的问题,习惯于devpi,并且想知道devpi和pypi服务器之间有什么区别?

比另一个更好?这一个量表哪个更好?

干杯

python pypi devpi python-packaging

5
推荐指数
1
解决办法
3181
查看次数

如何从包中的同级模块导入?

我的软件包具有以下结构:

myPackage
 -- __init__.py <-- empty
 -- signal.py
 -- plot.py
Run Code Online (Sandbox Code Playgroud)

signal.py包含:

from plot import plot_signal

def build_filter():
   ...

def other_function():
   plot_signal()
Run Code Online (Sandbox Code Playgroud)

plot.py包含:

from signal import build_filter

def plot_signal():
   ...

def other_function():
   build_filter()
Run Code Online (Sandbox Code Playgroud)

然后,我就有了使用此程序包的脚本,该程序包包含以下内容:

import myPackage as mp

mp.plot.plot_signal()
Run Code Online (Sandbox Code Playgroud)

运行此命令时,出现属性错误: module 'myPackage' has no attribute 'plot'

我不确定为什么将其plot作为包中的模块时将其称为属性,还是将其myPackage称为模块。

然后,我尝试导入我的包并以其他方式调用该函数:

from myPackage import plot, signal

plot.plot_signal()
Run Code Online (Sandbox Code Playgroud)

但是,现在我收到一个导入错误:cannot import name 'build_filter'追溯是指plot.py它试图build_filter()从同级模块导入函数的位置。

我认为这与以下事实有关:两个模块彼此使用函数,并递归地导入另一个模块。

组织此程序包以使同级模块可以相互导入功能的正确方法是什么?

python module python-module python-import python-packaging

5
推荐指数
1
解决办法
1174
查看次数

在setup.cfg中正确使用PEP 508环境标记

我试图通过指定仅在特定OS上有意义的依赖项来利用PEP 496-环境标记PEP 508-Python软件包的依赖项规范。

我的setup.py样子是这样的:

import setuptools
assert setuptools.__version__ >= '36.0'

setuptools.setup()
Run Code Online (Sandbox Code Playgroud)

我的最小setup.cfg看起来像这样:

[metadata]
name = foobar
version = 1.6.5+0.1.0

[options]
packages = find:

install_requires =
    ham >= 0.1.0
    eggs >= 8.1.2
    spam >= 1.2.3; platform_system=="Darwin"
    i-love-spam >= 1.2.0; platform_system="Darwin"
Run Code Online (Sandbox Code Playgroud)

但是,当尝试使用安装此类软件包时pip install -e foobar/,它将失败并显示:

pip._vendor.pkg_resources.RequirementParseError: Invalid requirement, parse error at "'; platfo'"
Run Code Online (Sandbox Code Playgroud)

我猜这里不希望有分号。但是我应该如何使用环境标记?

python setuptools python-3.x python-packaging

5
推荐指数
1
解决办法
641
查看次数

如何使用setup.py安装wheel样式的包

有没有办法,使用setup.py,安装python包作为wheel/pip风格的包(即dist-info)而不是setup.py默认情况下的egg安装(即egg-info)?

例如,如果我有一个带有setup.py脚本的python包,并且我运行以下命令,它将把包安装为egg.

> python setup.py install
Run Code Online (Sandbox Code Playgroud)

但是,我可以先构建一个轮子,然后使用pip将该轮子安装为wheel/dist-info类型的安装

> python setup.py bdist_wheel
> pip install ./dist/package-0.1-py2-none-any.whl
Run Code Online (Sandbox Code Playgroud)

有没有办法直接安装包作为wheel/dist-info安装setup.py?或者是同时使用两个步骤setuptoolspip必要吗?

python pip setuptools python-wheel python-packaging

5
推荐指数
1
解决办法
1071
查看次数

无法验证这些要求的哈希值,因为我们没有办法对版本控制存储库进行哈希处理

我有以下要求文件:

...
sqlalchemy==1.2.3 --hash=sha256:9e9ec143e2e246f385cfb2de8daa89d2fa466279addcb7be9e102988fdf33d24
werkzeug==0.14.1 --hash=sha256:d5da73735293558eb1651ee2fddc4d0dedcfa06538b8813a2e20011583c9e49b  
git+ssh://gitlab.domain.com/private_pkg.git#egg=private_pkg
Run Code Online (Sandbox Code Playgroud)

从shell安装项目非常完美:

pip install git+ssh://gitlab.domain.com/private_pkg.git#egg=private_pkg
Run Code Online (Sandbox Code Playgroud)

但尝试从需求文件安装它会引发此错误:

Can't verify hashes for these requirements because we don't have a way to hash version control repositories:
    private_pkg from git+ssh://gitlab.domain.com/private_pkg.git#egg=private_pkg (from -r requirements/prod.lock (line 30))
Run Code Online (Sandbox Code Playgroud)

注意:生成的需求文件中的哈希值pipenv lock -r

python pip python-3.x python-packaging pipenv

5
推荐指数
1
解决办法
315
查看次数