【问题标题】:Python "setup.py develop": is it possible to create ".egg-info" folder not in source code folder?Python“setup.py develop”:是否可以在源代码文件夹中创建“.egg-info”文件夹?
【发布时间】:2012-10-05 18:57:45
【问题描述】:

Python 能够“伪安装”一个包,方法是使用develop 而不是install 运行它的setup.py 脚本。这会修改 python 环境,因此可以从其当前位置导入包(它不会复制到 site-package 目录中)。这允许开发被其他包使用的包:源代码被原地修改,其余的 Python 代码可以通过简单的import 进行更改。

除了setup.py develop 命令创建一个带有与setup.py 相同级别元数据的.egg-info 文件夹外,一切正常。混合源代码和临时文件不是一个好主意 - 这个文件夹需要添加到从 vcs 开始到结束备份系统的多个工具的“忽略”列表中。

是否可以使用setup.py develop但在其他地方创建.egg-info目录,这样原始源代码就不会被临时目录和文件污染?

【问题讨论】:

  • 出于兴趣,setupy.py clean 处理完不需要的文件后会整理它们吗?
  • @pelson 否,“setup.py develop”期间创建的“.egg-info”目录不受“setup.py clean”的影响。这是意料之中的,因为这个目录不是临时目录——它是“开发者安装”的一部分。

标签: python setuptools distutils


【解决方案1】:

setup.py develop 就地创建一个 python 蛋; [修改] python 环境,以便可以从当前位置导入包。您仍然必须将其位置添加到 python 搜索路径或使用它所在的目录作为当前目录。

develop 命令的工作是创建就地 egg,其中可能包括编译 C 扩展、运行 2to3 python 转换过程以创建 Python3 兼容代码,以及提供元数据其他 em> python 代码可能依赖。当您将软件包作为鸡蛋安装到 site-packages 目录中时,同样的元数据也包含在其中。数据当然不是临时的(它是从您的setup.py 文件中提取的,以便其他工具轻松解析)。

这样做的目的是,您可以在依赖存在的元数据的更广泛系统中使用您的包时依赖该元数据,同时仍然开发包。例如,在buildout 开发部署中,我们经常使用mr.developer 来自动化获取给定包的源代码的过程,当我们需要处理它时,它将它构建为一个开发蛋并将其绑定到在我们处理代码的同时进行部署。

请注意,.egg-info 目录具有特定用途:向 setuptools 生态系统中的其他工具发出信号,表明您的软件包已安装且可用。如果您的包是您设置中另一个 egg 的依赖项,则满足该依赖项。 pipeasy_install 和 buildout 不会尝试从其他地方获取彩蛋。

除了创建.egg-info 目录之外,该命令唯一的其他 功能就是就地构建扩展。所以你正在寻找的命令是:

setup.py build_ext --inplace

这将与setup.py develop 执行完全相同的操作,但省略了.egg-info 目录。它也不会生成.pth 文件。

没有办法只生成.pth 文件而忽略.egg-info 目录生成。

从技术上讲,setup.py develop 还会检查您是否安装了 setuptools site.py 文件以支持命名空间包,但这与此处无关。

【讨论】:

  • Running build.py develop 还修补了 .pth 文件,以便我可以在受影响的计算机上导入模块/运行应用程序。对于setup.py build_ext --inplace,这不会发生:运行此命令不会注册模块/应用程序,并且之后无法导入/执行:(
  • @EyeofHell:是的,并且只有setup.py developeasy_install 命令会生成该文件。
  • @EyeofHell:请注意,您已经必须忽略 *.pyc 文件,或者,从 Python 3.2 开始,__pycache__ 子目录。 .egg-info 目录不是您在开发 Python 代码时唯一关心的问题。
  • 在这里,你仍然觉得你在顽固地违背常规。要么设置PYTHONDONTWRITEBYTECODE 和其他解决方法,要么设置工具忽略.pyc.egg-info。两者都是一次性的配置更改,但后者是目前的做法,更不用说在避免不断重新编译python代码的情况下更快。为什么这么麻烦,你希望获得什么优势?
  • 我将加入另一个动机:制表符完成。我讨厌输入ex<tab> 并让它想出example,而不是example/。我知道我可以按照 Christopher 的建议去做,"keep all source files inside (a) special directory" 但是,“我不想!哇!”:-)
【解决方案2】:

最好的方法是将所有源文件保存在名为您的项目名称的特殊目录中(使用其他语言的程序员将他们的代码保存在src 目录中)。因此,如果您的setup.py 文件位于myproject 目录中,那么您应该将文件保存在myproject/myproject。无论主目录中发生什么,此方法都会使您的源与其他文件分开。

我的建议是使用白名单而不是黑名单——告诉工具忽略除myproject 目录中的文件之外的所有文件。我认为这是不经常触摸您的ignore 列表的最简单方法。

【讨论】:

    【解决方案3】:

    试试--install-dir 选项。您可能还想使用--build-dir 更改构建目录。

    【讨论】:

    • 不幸的是,这不起作用:如果使用develop,两者都会被忽略:(。
    • 似乎您使用的是 setuptools,而不是 distutils - distutils 中没有 develop 命令。根据代码,develop 命令接受参数--egg-path=,应该做你想做的事
    • 我无法理解 '--egg-path' 的作用,但它也不起作用,任何 vlue 都会引发“错误:--egg-path 必须是安装目录的相对路径”错误:(
    • 路径 ../../outside/of/project/root 从项目中删除 tmpfiles 并且仍然是相对的。
    • --egg-path 仅设置 .egg-link 文件在写入时将指向 to 的位置。它与OP想要实现的目标无关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多