在导入语句之前设置pythonpath


70

我的代码是:

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

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

提前致谢


2
你试过了吗?该代码应该工作。但是,新值sys.path对您的程序而言是本地的($PYTHONPATH仅在启动解释器填充时读取该变量sys.path,而不会将其写回到环境中)。
filmor

Answers:


71

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

set.py:

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

loop.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代码还是对Atom.io都这样)?
pashute

是的,相当于Python“项目”的是VirtualEnv。VirtualEnvWrapper是一个不错的界面。它与Visual Studio的区别在于已经存在一个全局Python环境,而virtualenv只是在其上面建立了一个虚拟层。可能还有其他工具,我离开Python已经有几年了。

7

正如这里的文档中所述。
转到Python X.X/Lib并将这些行添加到site.py那里,

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

这改变了你 sys.path以便在每次加载时都具有该值。

如前所述这里site.py

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

有关添加一些路径以sys.path查看这些文档的其他可能方法


但这与在环境变量中手动设置值相同。我需要的是经常更改库的路径,例如从文件中获取scriptlib路径并在使用它们之前对其进行设置。
DKG

不,此值将附加到在初始化过程中自动加载的python.exeas的每次运行中site.py。。因此,您不需要import sys sys.path.append....每个文件中的。
pradyunsg 2013年

1
考虑一下我有2个相同python脚本副本的情况。一个脚本想要从C:\ testers \ scriptlib获取库,另一个想要从D:\ developer \ scriptlib获取库。在这种情况下,site.py如何确定将路径分配给谁。
DKG

@DKG在这种情况下,Python应该如何知道您要指的文件?您根本不应该将2个文件命名为相同的文件
pradyunsg

1
啊! 门开不了,因为傻匙孔错了!
米格尔(Miguel)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.