【问题标题】:Installable Python tar.gz package depends on OS used to build tarball可安装的 Python tar.gz 包取决于用于构建 tarball 的操作系统
【发布时间】:2020-03-10 18:07:36
【问题描述】:

我最近遇到了一个奇怪的场景,我想将我的(格式正确的)Python 包 coolpackage 转换为 tarball 以便简单地分发给一些同事,但生成的 tarball 的有效性取决于用于生成它的操作系统.

对于上下文,coolpackage 可以在 macOS 和 Ubuntu Linux 上通过 pip 从源目录安装而不会出现问题:

cd coolpackage
pip install .

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

现在,如果我在 Ubuntu 中生成了一个压缩包

# run inside Ubuntu 18.04
tar -czvf coolpackage.tar.gz coolpackage

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

pip install coolpackage.tar.gz

但是,如果我在 macOS 中生成一个压缩包

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

那个 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 中构建来避免这种情况,所以这不是一个直接的问题,但我不喜欢不理解 为什么 某些事情会失败。

【问题讨论】:

  • 也许尝试在没有 z 选项的情况下进行 tar 然后 gzip? (可能不是问题,但易于测试)
  • tar 的某些风格/方言并非完全可移植。如果您想在 Linux 上使用 BSD 版本,请尝试查找 bsdtar,如果您想要 BSD 上的 Linux (GNU) 版本(包括 Darwin -> MacOS),这似乎是您的情况,请尝试查找 gtar 而不是tar。这可能是导致pip 关闭的原因?
  • @Jean-FrançoisFabre - 好主意,但遗憾的是没有奏效,我有时间会尝试 gtar!
  • 当每个人都在上面玩滑翔机时,没有人在 MacOS 上遇到问题。祝你的问题好运。
  • 仅供参考,使用gtar 工作 - @OndrejK。如果您想将此作为“答案”提交,我可以接受。不太令人满意,因为我不清楚为什么 BSD tar 不起作用,但这确实提供了一个解决方案,以防其他人遇到它

标签: python linux gzip tar setup.py


【解决方案1】:

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

如果您想在 Linux 上运行 BSD tar,请尝试 bsdtar;如果您想在 BSD(以及其他一些 U*X 系统)上使用 GNU tar,请尝试 gtar

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

【讨论】:

    【解决方案2】:

    由于您使用的是 Python,因此最好直接使用其标准库中的 python -m tarfilepython -m gzip。它应该足够便携。

    另外,假设项目是用 setuptools(或 distutils)打包的,那么在大多数情况下直接使用 sdist 应该就足够了( python setup.py sdist)。

    【讨论】:

    • 谢谢 - 这可能实际上解决了我要解决的问题!
    猜你喜欢
    • 2019-10-27
    • 2021-04-29
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多