Python能够通过setup.py
脚本develop
而不是install
来运行“伪安装”软件包。这会修改python环境,因此可以从它的当前位置导入包(它不会被复制到site-package
目录中)。这允许开发其他包使用的包:源代码被修改到位,并且通过简单的import
可以对其余的python代码进行更改。
一切正常,但setup.py develop
命令创建的.egg-info
文件夹的元数据与setup.py
的级别相同。混合源代码和临时文件不是一个好主意 - 需要将此文件夹添加到从vcs和结束备份系统开始的多个工具的“忽略”列表中。
是否可以使用setup.py develop
但在其他地方创建.egg-info
目录,因此原始源代码不会受到临时目录和文件的污染?
答案 0 :(得分:17)
setup.py develop
就地创造了一个蟒蛇蛋;它确实不 [修改] python环境,因此可以从它的当前位置导入包。您仍然需要将它的位置添加到python搜索路径或使用它所在的目录作为当前目录。
develop
命令的工作是创建一个就地蛋,可能包括编译C扩展,运行2to3 python转换过程以创建Python3兼容代码,并提供元数据其他 python代码可能依赖于。将包作为鸡蛋安装在site-packages
目录中时,同样包含相同的元数据。数据当然不是临时的(它是从您的setup.py
文件中提取的,以便通过其他工具轻松解析。)
目的是,您可以在更广泛的系统中使用您的包时依赖于元数据,该系统依赖于存在的元数据,同时仍在开发包。例如,在buildout开发部署中,我们经常使用mr.developer
来自动化获取给定包的源代码的过程,当我们需要处理它时,将其构建为开发蛋和在我们处理代码时将其与部署联系起来。
请注意,.egg-info
目录用于特定目的:向setuptools eco系统中的其他工具发出信号,告知您的软件包已安装并可用。如果您的包是您的设置中另一个鸡蛋的依赖项,那么该依赖项就会满足。 pip
和easy_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
来更改建筑目录。