【问题标题】:set pythonpath before import statements在导入语句之前设置 pythonpath
【发布时间】:2013-02-13 02:38:23
【问题描述】:

我的代码是:

import scriptlib.abc
import scriptlib.xyz

def foo():
  ... some operations

但 scriptlib 位于其他目录中,因此我必须将该目录包含在环境变量“PYTHONPATH”中。

在导入语句执行之前,我可以先在环境变量“PYTHONPATH”中添加 scriptlib 目录吗:

import sys
sys.path.append('/mypath/scriptlib')
import scriptlib.abc
import scriptlib.xyz

def foo():
  ... some operations

如果是这样,该值是仅针对该命令提示符还是全局的?

提前致谢

【问题讨论】:

  • 你试过了吗?该代码应该可以正常工作。但是,sys.path 的新值对于您的程序来说是本地的($PYTHONPATH 变量仅在启动解释器以填充 sys.path 时读取,它不会写回环境中)。

标签: python path pythonpath


【解决方案1】:

这将为您的 Python 进程/实例(即正在运行的可执行文件)添加一个路径。不会为任何其他 Python 进程修改路径。另一个正在运行的 Python 程序不会修改其路径,如果您退出程序并再次运行,该路径将不会包含您之前添加的内容。你在做什么通常是正确的。

set.py:

import sys
sys.path.append("/tmp/TEST")

循环.py

import sys
import time
while True:
  print sys.path
  time.sleep(1)

运行:python loop.py &

这将运行 loop.py,连接到您的 STDOUT,并将继续在后台运行。然后您可以运行python set.py。每个都有一组不同的环境变量。观察到loop.py 的输出没有改变,因为set.py 没有改变loop.py 的环境。

关于导入的说明

Python 导入是动态的,与该语言的其他部分一样。没有进行静态链接。导入是一个可执行行,就像sys.path.append...

【讨论】:

  • 但我不想在我的代码中使用路径。我希望我的代码干净且可移植。是否没有“python项目”的概念。 (比如 Visual-studio-code 或 Atom.io)?!
  • 是的,Python“项目”的等价物是 VirtualEnv。 VirtualEnvWrapper 是一个很好的使用界面。这和Visual Studio的区别在于已经有一个全局的Python环境,而virtualenv只是在上面做了一个虚拟层。可能还有其他工具,我已经离开 Python 好几年了。
【解决方案2】:

如文档here 中所述。

转到Python X.Y/Lib (Windows) 或/usr/lib/pythonX.Y (Linux) 并将这些行添加到site.py 那里,

import sys
sys.path.append("yourpathstring")

这会更改您的 sys.path,以便在每次加载时,它都会包含该值..

here 所述,关于site.py

此模块在初始化期间自动导入。 导入此模块会将特定于站点的路径附加到模块搜索路径并添加一些内置函数。

有关向sys.path 添加一些路径的其他可能方法,请参阅these docs

【讨论】:

  • 但这与手动设置环境变量中的值相同。我需要经常更改库的路径,例如从文件中获取 scriptlib 路径并在使用它们之前进行设置。
  • 不,每次运行 python.exe 时都会附加此值,因为在初始化期间会自动加载 site.py。因此,您不需要在每个文件中使用 import sys sys.path.append....
  • 考虑我有 2 个相同 python 脚本副本的情况。一个脚本想要从 C:\testers\scriptlib 获取库,而另一个脚本想要从 D:\developer\scriptlib 获取库。在那种情况下,site.py 如何确定分配哪个路径和分配给谁。
  • @DKG 在那种情况下,Python 应该如何知道您指的是哪个文件?您根本不应该将 2 个文件命名为相同的...
  • 啊!门打不开,因为愚蠢的钥匙孔错了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
  • 2010-12-26
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 2015-12-25
  • 1970-01-01
相关资源
最近更新 更多