- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在构建我的包期间,我正在生成数据文件。
我想创建源代码分发 (setup.py sdist),比如如果它们最初在源代码树中,但是,我不想在源代码树中生成它们但是在其他地方(最好是构建/生成)以免弄乱我的源代码(并意外提交)。
例如,最后我想在 dist_root/generated/data.txt 下有 data.txt (“dist_root”是 setup.py 所在的位置)。
我使用了data_files setuptools(不是 package_data,因为这个数据不是包的)并且遇到了以下问题:
所以如果我输入 data_files = [('generated, temp/data.txt)],我将在分发中获得一条链路径dist_root/generated/temp/data.txt
似乎我唯一的选择是在 dist_root/generated/data.txt 下生成它但是,又一次,我弄乱了我的源代码树,并且不知道如何清理它,因为这个“生成的”文件夹名称是动态的。
有什么解决方法吗?
最佳答案
sdist
完成后删除它们您可以重写 sdist
命令以将文件写入源目录并在命令完成后清理它们:
import os
from distutils import dir_util
from setuptools import setup
from setuptools.command.sdist import sdist as sdist_orig
class sdist(sdist_orig):
def run(self):
# generate data files
genbase = os.path.join(os.path.dirname(__file__), 'temp')
self.mkpath(genbase)
with open(os.path.join(genbase, 'data.txt'), 'w') as fp:
fp.write('hello distutils world')
# run original sdist
super().run()
# clean up generated data files
dir_util.remove_tree(genbase, dry_run=self.dry_run)
setup(
...
data_files=[
('generated', ['temp/data.txt']),
],
cmdclass={'sdist': sdist},
)
sdist
temp 中调整源元数据虽然很脏,但最简单的方法是直接在 sdist 目录中更新源元数据。这样,您仍将拥有有效的 egg 元数据,并且不必在整个 sdist
方式中处理丢失的源文件。
genfiles = ['temp/data.txt']
class sdist(sdist_orig):
def make_release_tree(self, base_dir, files):
super().make_release_tree(base_dir, files)
for path in genfiles:
fullpath = os.path.join(base_dir, path)
self.mkpath(os.path.dirname(fullpath))
if not self.dry_run:
with open(fullpath, 'w') as fp:
fp.write('hello distutils world')
# also adapt source metadata file
cmd_egg_info = self.get_finalized_command('egg_info')
sourcemeta = os.path.join(base_dir,
cmd_egg_info.egg_name + '.egg-info',
'SOURCES.txt')
with open(sourcemeta, 'a') as fp:
fp.write('\n')
fp.write(path)
setup(
...,
data_files=[
('generated', genfiles),
],
cmdclass={'sdist': sdist},
)
基本上,在实际复制源文件之前,生成的数据文件会被忽略。然后,生成文件(作为复制现有文件的替代),并且由于源元数据不完整,因此使用生成的文件对其进行更新。
我强烈建议不要这样做。
所有其他方法会更脏,因为它们会将不存在的文件写入元数据并使 distutils
/setuptools
忽略不存在的文件生成源分发的整个方式。但如果你坚持,这里有一个尽可能少的猴子修补的解决方案:
genfiles = ['temp/data.txt']
class FileList(setuptools.command.egg_info.FileList):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.files += genfiles
def _safe_path(self, path):
return path in genfiles or super()._safe_path(path)
class sdist(sdist_orig):
def run(self):
# monkeypatch begin
FileListOrig = setuptools.command.egg_info.FileList
setuptools.command.egg_info.FileList = FileList
# monkeypatch end
super().run()
# restore the original class
setuptools.command.egg_info.FileList = FileListOrig
def make_release_tree(self, base_dir, files):
super().make_release_tree(base_dir, files)
for path in genfiles:
fullpath = os.path.join(base_dir, path)
self.mkpath(os.path.dirname(fullpath))
if not self.dry_run:
with open(fullpath, 'w') as fp:
fp.write('hello distutils world')
setup(
...,
data_files=[
('generated', genfiles),
],
cmdclass={'sdist': sdist},
)
关于python 源代码分发 (sdist) - 生成的数据文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49902066/
tosca-parser 从 github 下载, 使用时 python setup.py develop ,它提示:此项目的版本控制需要 sdist tarball,或访问上游 git 存储库。所以
创建了一个安装文件。使用以下代码,其中 setup.py 为 import sys from distutils.core import setup setup( name='SomePack
我正在构建几个 Python 包,只有在所有包都已成功构建后我才想上传它们。我为每个 Python 包都有一个单独的阶段,其 sdist 被带到最后一个阶段,所有收集的 sdist 应该被上传(如果构
在构建我的包期间,我正在生成数据文件。 我想创建源代码分发 (setup.py sdist),比如如果它们最初在源代码树中,但是,我不想在源代码树中生成它们但是在其他地方(最好是构建/生成)以免弄乱我
我正在寻找一种方法来生成文件并将其包含到由 sdist/wheel 创建的包中。 是否有某种方法可以 Hook 进程来创建将在构建过程中拾取的新文件。 最佳答案 在build阶段构建文件覆盖cmdcl
我知道在 setuptools 中,如果我想指定源代码分发的创建,我只需运行: setup.py sdist 使用 formats 标志,我可以指定输出分发格式(例如 zip 和/或 tar - 请参
想要通过从我要打包的目录之外的目录运行 python setup.py sdist 来创建 python 源代码分发。似乎无法找到一种方法来做到这一点。我有一个动态生成 setup.py 和 MANI
我想将测试添加到我的 setuptools 发行版中的 sdist 包中,但我不想将它们安装在/在 bdist 中>。我已经有: setup( ... packages = find_pa
我正在尝试通过 pip(存储在 Pypi 上)交付 Django 应用程序。问题是,当我使用 pip 安装应用程序时,它不包含主要指定包内的静态文件夹。 这是我的: ├── LICENSE.txt ├
Python setuptools 可以创建源代码分发: python setup.py sdist # create a source distribution (tarball, zip file
突然间,所有 Python 包都被 pip 报告为已过期 pip list --outdated 表示[sdist],如 awscli (Current: 1.7.19 Latest: 1.7.20
我正在尝试使用 setup.py sdist 对我的项目进行源代码分发。我已经有了可以安装的正常运行的 setup.py。但是当我执行 sdist 时,我得到的只是 my_project 文件夹中的另
我要打包的项目结构如下: ├── doc │ └── source ├── src │ ├── core │ │ ├── config │ │ │ └── log.tmpl
我想在 conda 构建配方中获取 meta.yaml 的 sdist url。它需要从 URL 获取特定版本或最新版本。当我使用 CI/CD 的 Github 操作执行此操作时,我需要自动检索特定版
我是creating a Python3 application这取决于项目中的静态文件目录。 项目结构: myBlanky \__blankys \__bootstrap
有没有办法获取setup.py sdist构建的tar文件的路径?我知道它在哪里,但我希望编写脚本而不必 ls dist/ 等。如果 distutils 也分配了一个变量,我也可以覆盖命令,或者将返回
我的 MANIFEST.in 中有这个 recursive-include tables *.csv 我可以看到包含在创建的 .tar.gz 中的文件夹 /mypackage-0.0.1 /m
我一直在寻找这个问题的答案,但找不到任何人。但是在这张图片中你可以看到我的问题...... Cannot find sdist pip-*.tar.gz 但是我跟着installation guide
对于我编写的包,我完成了 python setup.py sdist bdist_wheel,它在 dist/ 目录中生成了一些包工件。现在我想在这些工件中运行包的单元测试。有什么好的方法吗? 需要说
我正在开发一个使用 namespace_packages 和 find_packages() 的 Python 包,就像在 setup.py 中一样: from setuptools import s
我是一名优秀的程序员,十分优秀!