小编sin*_*roc的帖子

从 github 运行 tox 时出现“ERROR: py37: InterpreterNotFound: python3.7”

我在 GitHub 上有一个带有 tox.ini 文件的项目:

[tox]
envlist = py3

[testenv]
deps = -rrequirements.txt
commands =
    pytest --doctest-modules
Run Code Online (Sandbox Code Playgroud)

效果很好。但是当我用“py37”替换“py3”时,它失败并出现错误:

ERROR:  py37: InterpreterNotFound: python3.7
Run Code Online (Sandbox Code Playgroud)

据我所知,tox应该支持Python 3.7。这是 github 上的 tox 特有的问题吗?

github tox python-3.7 github-actions

11
推荐指数
1
解决办法
1万
查看次数

使用 setuptools 和 pyproject.toml 分发 shell 脚本

我正在尝试将 shell 脚本与 Python 包一起分发。理想情况下,shell 脚本在我运行时安装pip install my_package。我从这篇文章中读到,我的预期行为正是scripts关键字 ofsetuptools.setup所提供的。例如,该脚本my_script将使用以下setup.py脚本进行安装:

setup(
    ...
    scripts=['my_script'],
    ... 
) 
Run Code Online (Sandbox Code Playgroud)

但是,我无法使用上述方法,原因有两个:

  1. 官方文档没有提到这种行为。我不知道我是否还能继续这样下去。
  2. 我的整个项目都是建立在pyproject.toml, 没有setup.py. 虽然pyproject.toml已经提供了[project.scripts]表格,但正如setuptools 官方文档中所解释的那样,脚本只能是 python 函数,而不能是 shell 脚本。

为了完整起见,在我的例子中,shell 脚本读取git状态并设置环境变量,这些变量将从我的 python 项目中读取。shell 脚本和我的 python 项目结合得如此紧密,以至于我宁愿不将它们分成两个项目。

我也尝试过使用python函数来执行shell脚本,例如

[project.scripts]
my_script = 'my_project:my_func'
Run Code Online (Sandbox Code Playgroud)
def my_func():
    subprocess.run(...)
Run Code Online (Sandbox Code Playgroud)

这个解决方案的问题是,每次运行my_script,my_project都会加载,并且加载过程非常慢。

setuptools setup.py python-packaging pyproject.toml

11
推荐指数
2
解决办法
2445
查看次数

尝试在iOS 13或tvOS 13中使用AVPictureInPictureController时出现错误

我有一个小应用程序,可在iOS和tvOS上运行,并在UIView中显示视频。它确实支持iOS 12和tvOS 12。 ”。

即使部署目标设置为tvOS13。在Xcode中,功能->背景模式->启用了“音频,Airplay和画中画”。此基本代码给出了错误。

#import <AVKit/AVKit.h>
if ([AVPictureInPictureController isPictureInPictureSupported]) {
   // code 
}
Run Code Online (Sandbox Code Playgroud)

是否缺少其他设置或我需要做的其他事情?

谢谢

picture-in-picture ios13 tvos13

10
推荐指数
1
解决办法
160
查看次数

pip 的 requirements.txt 最佳实践

我正在尝试requirements.txt为某人生成复制我的环境。您可能知道,标准方法是

pip freeze > requirements.txt
Run Code Online (Sandbox Code Playgroud)

我注意到这将列出所有包,包括已安装包的依赖项,这使得这个列表变得不必要。然后我浏览了一下,发现pip-chill它允许我们只列出requirements.txt.

现在,根据我的理解,当有人尝试使用 复制环境时pip install -r requirements.txt,这将自动安装已安装软件包的依赖项。

如果这是真的,这意味着使用pip-chill而不是pip生成requirements.txt. 我的问题是,是否还有其他风险可以使用pip-chill我在这里缺少的已安装软件包的依赖项?

pip requirements.txt

10
推荐指数
2
解决办法
3200
查看次数

有没有办法以编程方式确认 python 包版本满足需求说明符?

我正在尝试寻找是否有办法获取已安装的软件包和版本并检查它是否满足要求规范。

例如,如果我有包 pip==20.0.2,我希望程序执行以下操作:

CheckReqSpec("pip==20.0.2", "pip>=19.0.0")  -> True
CheckReqSpec("pip==20.0.2", "pip<=20.1")    -> True
CheckReqSpec("pip==20.0.2", "pip~=20.0.0")  -> True
CheckReqSpec("pip==20.0.2", "pip>20.0.2")   -> False
Run Code Online (Sandbox Code Playgroud)

我发现 pkg_resources.extern.packaging 有 version.parse,这对于比较大于或小于的不同版本很有用,但要求规范可能非常复杂,并且有像 ~= 这样的运算符不是标准数学运算符。

setuptools 文档有这个例子:

PickyThing<1.6,>1.9,!=1.9.6,<2.0a0,==2.4c1
Run Code Online (Sandbox Code Playgroud)

是否有现有的方法可以进行此检查,或者有一种简单的方法可以让我自己进行检查?

编辑: ~= 特别困难,特别是当规格作为变量输入时。* 版本要求也很难弄清楚,因为

 version.parse("20.0.*") == version.parse("20.0.1") # False
 version.parse("20.0.*") < version.parse("20.0.0")  # True 
 version.parse("20.0.*") < version.parse("20.1.1")  # True 
 version.parse("20.0.*") >= version.parse("20.0.0") # False
Run Code Online (Sandbox Code Playgroud)

python pip requirements.txt python-packaging

10
推荐指数
1
解决办法
934
查看次数

在不使用 setup.py 的情况下开发 Python 包的首选方法是什么?

我正在开发一个 Python 包,我不想pip install .每次更改某些内容时都必须继续运行以重新安装我的包。除非我有文件,否则使用-eor--editable似乎不起作用setup.py,也没有--no-use-pep517pyproject.toml如果我没记错的话,我有一个替代方案,这是现在的首选。那么,现在最好的方法是什么?

我的包只是一个 CLI 脚本,但它从同一目录另一个名为utils.py. 开发时,我不能只从终端手动运行脚本,因为这样我会从行中得到“name_of_package不是一个包from name_of_package.utils import function” 。而如果我只有from utils import function,我可以从终端运行脚本,但是当我pip install运行时,它会说“没有名为utils”的模块。

我确实安装poetry并安装了我的依赖项,运行poetryshell,然后尝试使用 运行我的脚本poetry run /path/to/script.py,但我不断收到错误消息,指出我的包不是包。

pip setuptools setup.py python-packaging python-poetry

10
推荐指数
1
解决办法
5472
查看次数

如何获取当前的“包”名称?(setup.py)

如何获取当前最顶层的包,即setup.py 中定义的名称?

这是我的tree

.
|-- README.md
|-- the_project_name_for_this_pkg
|   |-- __init__.py
|   |-- __main__.py
|   |-- _config
|   |   `-- foo.conf
|   |-- _data
|   |   `-- logging.yml
|   `-- tests
|       |-- __init__.py
|       `-- test_foo.py   <--- # executing from here
|-- requirements.txt
`-- setup.py

4 directories, 9 files
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经开始工作的唯一解决方案是:

import os
import sys


os.path.basename(sys.path[1])
Run Code Online (Sandbox Code Playgroud)

但这显然是一个糟糕的解决方案。其他解决方案,例如__name__在我最上层的__init__.py文件中使用a并ast.parse用于阅读 的相关部分setup.py也似乎很麻烦。

我尝试过的其他解决方案 - 通过在我的python [子] 包中的unittest.TestCase继承class中调用它们tests- 包括检查 …

python setuptools python-packaging

9
推荐指数
1
解决办法
3810
查看次数

9
推荐指数
3
解决办法
505
查看次数

使用Setuptools(setup.py)构建Python包时使用动态版本

我们有一个大型遗留项目,其中包含一些 python 代码,项目中所有组件的版本都是在运行时由构建项目的构建系统设置的。我们现在需要使用其他组件使用的相同版本来打包 python 代码。
该包当前使用以下命令进行存档,python setup.py bdist_wheel没有版本控制。

问题是我们如何在构建期间将动态版本传递给 setup.py 命令。就像是:

python setup.py --version x.x.x bdist_wheel
Run Code Online (Sandbox Code Playgroud)

有几个选项可以覆盖版本文件,例如version.pyversion.txt使用新版本,然后在文件中使用它setup.py,但假设我们无法向构建过程添加更多步骤,只能修改构建命令和 python 文件,如何才能可以做吗?

其他要求:

  • 如果没有传递任何版本,则应使用默认值。
  • 该版本应该在 python 代码中可用(就像将其作为__version__参数一样__init__.py
  • 如果可能的话应该支持元数据配置的使用setup.cfgpyproject.toml元数据配置

python setuptools setup.py sdist

9
推荐指数
1
解决办法
3779
查看次数

MyPy 找不到我的本地包的类型

我有两个 python 包。一种是 util 库,一种是将使用 util 库的应用程序(最终我将有更多应用程序共享该库。

path我对两者都使用诗歌,并且应用程序使用和属性将公共库指定为依赖项develop

例如,我的布局看起来像这样:

- common/
   - common/
      - __init__.py
      - py.typed
   - pyproject.toml

- myapp/
   - myapp/
      - __init__.py
      - py.typed
   - pyproject.toml
Run Code Online (Sandbox Code Playgroud)

看起来myapp\pyproject.toml像这样:

[tool.poetry]
name = "myapp"
version = "0.1.0"
description = ""
authors = ["Your Name <you@example.com>"]

[tool.poetry.dependencies]
python = "^3.9"
common = { path = "../common", develop = true }

[tool.poetry.dev-dependencies]
mypy = "^0.910"
flake8 = "^4.0.1"
black = {version = "^21.12b0", allow-prereleases = true}
pytest …
Run Code Online (Sandbox Code Playgroud)

python mypy python-typing python-poetry

9
推荐指数
1
解决办法
3732
查看次数