10

安装后,我想对安装创建的一些配置和数据文件进行软链接。

如何确定从包的 setup.py 中安装的新包文件的位置?

我最初对路径“/usr/local/lib/python2.7/dist-packages”进行了硬编码,但是当我尝试使用虚拟环境时它就坏了。(由 virtualenv 创建。)

我尝试了 distutils.sysconfig.get_python_lib(),它在 virtualenv 中工作。然而,当安装在真实系统上时,它返回“/usr/lib/python2.7/dist-packages”(注意“本地”目录不存在。)

我也尝试过 site.getsitepackages():

从基础环境运行 Python shell:

进口网站

site.getusersitepackages()

'/home/sarah/.local/lib/python2.7/site-packages'

site.getsitepackages()

['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

从虚拟环境“testenv”运行 Python shell:

进口网站

site.getsitepackages()

回溯(最近一次通话最后):

文件“”,第 1 行,在

AttributeError:“模块”对象没有属性“getsitepackages”

我在 Ubuntu 上运行“Python 2.7.3(默认,2012 年 8 月 1 日,05:14:39)”和“Linux2 上的 [GCC 4.6.3]”。我可能可以用 try-except 块拼凑一些东西,但似乎应该有一些变量集 / 由 distutils / setuptools 返回。(我不知道使用哪个分支,只要它有效。)

谢谢。

4

2 回答 2

1

我还没有找到这样做的“正确”方法,但我发现了一些看起来几乎正确的技巧。一种方法仅适用于安装;另一个仅在已安装软件包时才有效。

对于安装,我使用返回的对象setuptools.setup()

from setuptools import setup
s = setup([...])
installation_path = s.command_obj['install'].install_lib

(这仅在安装期间有效,因为您需要一个有效的Distribution对象才能使这些属性存在。AFAIK,获取此类对象的唯一方法是运行setup()。)

在卸载时,我使用包的文件属性,正如上面@Zhenya 所建议的那样。唯一的问题是,当我跑去./setup.py uninstall摆脱时 ,package我通常有目录./package/、、、和。(“卸载”选项被我的代码捕获,而无需调用 setup()。它运行手动创建的脚本来删除包文件。)这些可以将 python 解释器重定向到我所在的全局可访问存储库之外的某个地方试图摆脱。这是我处理这个问题的技巧:./build./dist./package.egg-info/

import imp
import sys
from subprocess import Popen
from os import getcwd
Popen('rm -r build dist *.egg-info', shell=True).wait()
oldpath = sys.path
rundir = getcwd()
sys.path.remove(rundir)
mod = imp.find_module(PACKAGE)
p = imp.load_module(PACKAGE, mod[0], mod[1], mod[2])
sys.path = oldpath
installation_path = p.__file__

(这在安装过程中不起作用,因为 - 我认为 - Python 在启动时只对模块进行清单,所以 find_module() 不会找到刚刚安装的包,除非你退出 python 并重新进入。)

我已经在裸环境和虚拟环境(来自 virtualenv 1.9.1)上测试了安装和卸载。我正在运行 Ubuntu 12.04 LTS、Python 2.7.3、setuptools 0.6c11(在裸环境中)和 setuptools 0.7.4(在 virtualenv 中)。

于 2013-06-27T21:16:08.740 回答
0

这可能不会回答您的问题,但如果您需要访问已安装的软件包的源代码,或此软件包中的任何其他文件,最好的方法是在开发模式下安装此软件包(通过下载源,把它放在你想要的任何地方,然后在包源的基本目录中运行 python setup.py develop )。这样你就知道包的位置。

于 2013-06-25T12:01:36.817 回答