好的,所以我真的想要做到这一点,因为我在生成一些大的py2app/py2exe包时会继续遇到它.所以我的包中包含很多模块/包,这些模块/包也可能在用户站点包/默认位置(如果用户有python发行版)但我希望我的分布式包在从我的发行版运行时生效.
现在从我在这里 读到的PYTHONPATH应该是当前目录之后添加到sys.path的第一件事,但是我在我的机器上测试的情况并非如此,所有定义的文件夹$site-packages$/easy-install.pth优先于此.
那么有人可以给我一些关于这个导入顺序的更深入的解释//帮我找到一种方法来设置环境变量,使我分发的包优先于默认安装的包.到目前为止,我的尝试是,例如在Mac-OS py2app上,在我的入口点脚本中:
os.environ['PYTHONPATH'] = DATA_PATH + ':'
os.environ['PYTHONPATH'] = os.environ['PYTHONPATH'] + os.path.join(DATA_PATH
, 'lib') + ':'
os.environ['PYTHONPATH'] = os.environ['PYTHONPATH'] + os.path.join(
DATA_PATH, 'lib', 'python2.7', 'site-packages') + ':'
os.environ['PYTHONPATH'] = os.environ['PYTHONPATH'] + os.path.join(
DATA_PATH, 'lib', 'python2.7', 'site-packages.zip')
Run Code Online (Sandbox Code Playgroud)
这基本上是py2app生成的包的结构.那我就是:
SERVER = subprocess.Popen([PYTHON_EXE_PATH, '-m', 'bin.rpserver'
, cfg.RPC_SERVER_IP, cfg.RPC_SERVER_PORT],
shell=False, stdin=IN_FILE, stdout=OUT_FILE,
stderr=ERR_FILE)
Run Code Online (Sandbox Code Playgroud)
这里PYTHON_EXE_PATH是由py2app添加到包的python exe的路径.现在,这在没有安装python的机器上运行良好.但是,当python发布已经存在时,它们的站点包优先.
如果我从easy_install安装了软件包,则会sys.path在PYTHONPATH变量中的项之前添加egg .
例如,如果我在当前目录中安装了一个名为foo的egg包以及一个名为foo的包,那么执行以下操作:
PYTHONPATH="." python
>>> import foo
Run Code Online (Sandbox Code Playgroud)
这将使用egg版本foo而不是本地目录.检查sys.path显示鸡蛋放在物品之前PYTHONPATH.这似乎破了.有没有办法覆盖这种行为?