从setup.py中检测python包安装路径

时间:2013-06-10 18:21:40

标签: python path installation setup.py

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

如何从软件包的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()

      
    
  
     

'/家/萨拉/。本地/ LIB / python2.7 /站点包'

     
    
      
        

site.getsitepackages()

      
    
  
     

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

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

  
    
      
        

导入网站

                 

site.getsitepackages()

      
    
  
     

追踪(最近一次呼叫最后一次):

     

文件“”,第1行,

     

AttributeError:'module'对象没有属性'getsitepackages'

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

感谢。

2 个答案:

答案 0 :(得分: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/./build./dist和{{1} }。 (我的代码捕获“卸载”选项而不调用setup()。它运行一个手动创建的脚本来删除包文件。)这些可以将python解释器重定向到除全局可访问的存储库之外的某个地方我是试图摆脱。这是我的黑客处理:

./package.egg-info/

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

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

答案 1 :(得分:0)

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