使用distribute/setuptools创建符号链接(或运行脚本)?
在我项目的设置过程中,我需要把一个包的符号链接(symlink)指向一个指定的目录,这样一个 init.d 脚本才能找到它。有没有办法把这个操作加到 setup()
的后处理命令里?我甚至可以接受创建另一个文件来生成这个链接,然后把它作为某个参数传给 setup()
,如果有这样的选项的话。
setup(
...
packages = find_packages('src'),
package_dir = {'': 'src'},
install_requires = ...,
data_files = [('/etc/init.d', ['scripts/foo'])],
...
)
这个 foo
脚本需要从 src/
目录中的一个包创建符号链接到其他地方(比如说,不仅仅是放在 PYTHONPATH
中)。有没有办法做到这一点?
3 个回答
在@pjeby的回答基础上,你还可以扩展安装命令,添加自己想要的后续步骤。不过,这样的做法只在从源代码安装时有效(也就是运行setup.py的时候),其他的安装工具,比如RPM和MSI,会默默忽略你所做的更改。
编辑:经过一些搜索后发现,似乎不应该自己去创建符号链接:http://docs.python.org/2/install/index.html#alternate-installation
我知道这篇帖子已经好几年了,但我想更新一下,告诉大家在setup.py中是可以进行后处理的。简单来说,你需要重写setuptools的安装功能,从那以后你就可以添加任何你想要的代码,比如复制MANIFEST.in不愿意复制的符号链接。这是来自Peter Lamut的解决方案。
from setuptools.command.install import install
class CustomInstallCommand(install):
"""Customized setuptools install command - prints a friendly greeting."""
def run(self):
print "Hello, developer, how are you? :)"
install.run(self)
#post-processing code
setup(
...
cmdclass={
'install': CustomInstallCommand,
},
...
)
目前,只有一些特定平台的包管理工具(比如RPM、deb、win32安装程序)可以在安装后执行一些步骤:像distutils、setuptools这些工具并不直接支持这个功能。(除了它们可以让你构建RPM、Windows安装程序等。)
所以,如果你想在没有特定平台安装程序的情况下做到这一点,最简单的方法就是自己创建一个后安装脚本,或者在你现有的脚本中添加一个后安装选项,然后告诉用户去运行它。否则,你就得使用bdist_rpm或者其他bdist命令来为合适的平台构建一个安装程序。