Python“setup.py develop”:是否可以在源代码文件夹中创建“.egg-info”文件夹?

时间:2012-10-15 18:29:36

标签: python setuptools distutils

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

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

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

3 个答案:

答案 0 :(得分:17)

setup.py develop就地创造了一个蟒蛇蛋;它确实 [修改] python环境,因此可以从它的当前位置导入包。您仍然需要将它的位置添加到python搜索路径或使用它所在的目录作为当前目录。

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

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

请注意,.egg-info目录用于特定目的:向setuptools eco系统中的其他工具发出信号,告知您的软件包已安装并可用。如果您的包是您的设置中另一个鸡蛋的依赖项,那么该依赖项就会满足。 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文件以支持命名空间包,但这与此无关。

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

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

相关问题