我需要将一个包写入存储库,但它是一个小型快速包,因此我认为不需要将文件放入子目录中。我只是想要:
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) 假设我有一个模块:
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,foo和bar,但看不到导入的add_one:
Help on package mymodule:
NAME
mymodule
PACKAGE CONTENTS
example
FUNCTIONS
bar() …Run Code Online (Sandbox Code Playgroud) 使用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
我有一个像这样的 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
我使用 conda 使用 python 3.10.9 创建一个新环境。我使用 pip 安装了诗歌,在添加几个包后,该poetry add pkg命令不起作用并出现错误消息:
HTTPResponse.__init__() got an unexpected keyword argument 'strict'
Run Code Online (Sandbox Code Playgroud)
我用谷歌搜索了这个问题,但没有答案,如何解决?
让诗歌添加命令正常工作
在这里有一个简短的问题,习惯于devpi,并且想知道devpi和pypi服务器之间有什么区别?
比另一个更好?这一个量表哪个更好?
干杯
我的软件包具有以下结构:
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()从同级模块导入函数的位置。
我认为这与以下事实有关:两个模块彼此使用函数,并递归地导入另一个模块。
组织此程序包以使同级模块可以相互导入功能的正确方法是什么?
我试图通过指定仅在特定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)
我猜这里不希望有分号。但是我应该如何使用环境标记?
有没有办法,使用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?或者是同时使用两个步骤setuptools和pip必要吗?
我有以下要求文件:
...
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 ×10
python-packaging ×10
setuptools ×4
pip ×2
python-3.x ×2
devpi ×1
module ×1
pipenv ×1
pypi ×1
python-wheel ×1