python路径和导入ord

2024-06-10 01:00:52 发布

您现在位置:Python中文网/ 问答频道 /正文

好的,所以我真的想把这个弄对,因为在生成一些大的py2app/py2exe包时,我一直在运行它。因此,我的包中包含许多模块/包,这些模块/包也可能位于用户站点包/默认位置(如果用户具有python发行版),但我希望从发行版运行时,我的分布式包在它们之前生效。

现在从我所读到的herePYTHONPATH应该是在当前目录之后添加到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')

这基本上就是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)

PYTHON_EXE_PATH是py2app添加到包中的PYTHON EXE的路径。现在,在一台没有安装python的机器上,这个方法运行得很好。但是,当python发行版已经存在时,它们的站点包优先。


Tags: 模块pathdataserveroslibpackagesenviron
3条回答

Python按顺序搜索sys.path中的路径(请参见http://docs.python.org/tutorial/modules.html#the-module-search-path)。easy_install直接更改此列表(请参阅easy-install.pth文件中的最后一行):

import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)

这基本上接受添加的任何目录,并将它们插入列表的开头。

另请参见Eggs in path before PYTHONPATH environment variable

导入模块后,python首先从目录列表中搜索。 如果找不到,则从目录列表中搜索。python可能会在您的操作系统上搜索其他列表

import time , sys
print (sys.modules)
print (sys.path)

输出是目录列表:

{... , ... , .....}
['C:\\Users\\****', 'C:\\****', ....']

time模块按照sys.modulessys.path列表的顺序导入。

编辑:怎么回事,比分是-1?为什么?我在这里所说的一切都是正确的,有到Python文档的链接作为证明。。。严肃的wtf?


此页面是“Python导入顺序”的高Google结果,因此希望这里有一个更清楚的解释:

正如这两页所解释的,import顺序是:

  1. 内置python模块。您可以在变量sys.modules中看到列表。
  2. sys.path条目。
  3. 依赖于安装的默认位置。

正如sys.path文档页面所解释的,它被填充如下:

  1. 第一个条目是以python开头的文件目录的完整路径(因此/someplace/on/disk/> $ python /path/to/the/run.py表示第一个路径是/path/to/the/,同样,如果您在/path/to/> $ python the/run.py(它仍然将被设置为目录的完整路径)),或者,如果python是在没有文件aka interactive mode的情况下启动的(空字符串表示“python进程的当前工作目录”)。换言之,Python假设您启动的文件希望能够执行与启动Python的文件位于同一位置的package/-foldersblah.py模块的相对导入。
  2. sys.path中的其他条目由PYTHONPATH环境变量填充。基本上是你的全局pip文件夹。

所以,基本上:是的,您可以相信Python会在全局安装pip之前首先找到本地包文件夹和模块文件。

这里有一个例子可以进一步解释:

myproject/ # <-- This is not a package (no __init__.py file).
  modules/ # <-- This is a package (has an __init__.py file).
    __init__.py
    foo.py
  run.py
  second.py

executed with: python /path/to/the/run.py
will cause sys.path[0] to be "/path/to/the/"

run.py contents:
import modules.foo as foo # will import "/path/to/the/" + "modules/foo.py"
import second # will import "/path/to/the/" + "second.py"

second.py contents:
import modules.foo as foo # will import "/path/to/the/" + "modules/foo.py"

相关问题 更多 >