可安装 Python tar.gz 包依赖于 OS 用于构建 tarball

Installable Python tar.gz package depends on OS used to build tarball

我最近遇到了一个奇怪的情况,我想将我的(正确格式的)Python 包 coolpackage 转换成一个 tarball 以便简单地分发给一些同事,但是生成的 tarball 的有效性取决于用于生成它的 OS。

对于上下文,coolpackage 可以通过 pip 在 macOS 和 Ubuntu Linux 上从源目录安装,没有问题:

cd coolpackage
pip install .

这适用于 macOS 和 Linux,并且在这两种情况下都是 运行 在 conda 环境中,在包方面是相同的。

现在,如果我在 Ubuntu

中生成一个 tarball
# run inside Ubuntu 18.04
tar -czvf coolpackage.tar.gz coolpackage

然后 tar.gz 文件可以在 macOS 和 Ubuntu 上使用 pip 安装:

pip install coolpackage.tar.gz

但是,如果我在 mac 中生成 tarballOS

# run inside macOS Mojave
tar -czvf coolpackage.tar.gz coolpackage

That tarball 在 macOS 或 Ubuntu 上都无法安装,并且在两种情况下退出时出现基本相同的错误(尽管有路径):

    pip install coolpackage.tar.gz
    Processing ./coolpackage.tar.gz
    ERROR: Command errored out with exit status 1:
     command: /Users/alex/Python/conda/envs/localconda/bin/python -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/2n/xtzsyspd32v6vglg_pd5gmw80000gn/T/pip-req-build-tz8wnxlx/setup.py'"'"'; __file__='"'"'/private/var/folders/2n/xtzsyspd32v6vglg_pd5gmw80000gn/T/pip-req-build-tz8wnxlx/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /private/var/folders/2n/xtzsyspd32v6vglg_pd5gmw80000gn/T/pip-req-build-tz8wnxlx/pip-egg-info
         cwd: /private/var/folders/2n/xtzsyspd32v6vglg_pd5gmw80000gn/T/pip-req-build-tz8wnxlx/
    Complete output (5 lines):
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/Users/alex/Python/conda/envs/localconda/lib/python3.7/tokenize.py", line 447, in open
        buffer = _builtin_open(filename, 'rb')
    FileNotFoundError: [Errno 2] No such file or directory: '/private/var/folders/2n/xtzsyspd32v6vglg_pd5gmw80000gn/T/pip-req-build-tz8wnxlx/setup.py'
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.

想知道是否有人以前遇到过这种情况,或者对可能发生的事情有想法?我可以通过构建 Linux 来避免这种情况,所以这不是一个直接的问题,但我不喜欢不理解 为什么 某些事情失败了。

tar 有多种方言/风格,大体相似。在这种情况下,我们正在研究 Linux 系统上常用的 GNU 工具和 BSD 上使用的 BSD 工具(-> Darwin -> MacOS X)。

如果你想在 Linux 上使用 运行 BSD tar 试试 bsdtar 如果你想在 BSD 上使用 GNU tar(还有一些其他的U*X 系统),尝试 gtar.

这也转化为 tarballs 的其他消费者,这似乎是 trips pip 显然需要 GNU 版本 (gtar) 风格的输入。

由于您正在使用 Python,直接使用其标准库中的 python -m tarfile and python -m gzip 可能是个好主意。它应该足够便携。

此外,假设项目与 setuptools(或 distutils)一起打包,使用 sdist 在大多数情况下直接应该就足够了 (python setup.py sdist).