我还没有找到“正确”的方法,但我发现了一些看起来几乎正确的技巧。一种方法仅适用于安装;另一个仅在已安装软件包的情况下才有效。
对于安装,我使用返回的对象setuptools.setup()
:
from setuptools import setup
s = setup([...])
installation_path = s.command_obj['install'].install_lib
(这仅在安装期间有效,因为您需要有效的Distribution
这些属性存在的对象。 AFAIK,获得这样一个对象的唯一方法是运行setup()
.)
卸载时,我使用file包的属性,如上面@Zhenya 所建议的。唯一的问题是当我跑步时./setup.py uninstall
摆脱package
,我通常有目录./package/
, ./build
, ./dist
, and ./package.egg-info/
。 (我的代码捕获了“卸载”选项,而无需调用 setup()。它运行手动创建的脚本来删除包文件。)这些可以将 python 解释器重定向到除我所在的全局可访问存储库之外的某个位置试图摆脱。这是我处理这个问题的技巧:
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 中)。