在导入语句之前设置Python路径

82

我的代码是:

import scriptlib.abc
import scriptlib.xyz

def foo():
  ... some operations

但是脚本库在其他目录中,所以我必须将该目录包含在环境变量“PYTHONPATH”中。有没有办法在执行导入语句之前先将脚本库目录添加到环境变量“PYTHONPATH”中?
import sys
sys.path.append('/mypath/scriptlib')
import scriptlib.abc
import scriptlib.xyz

def foo():
  ... some operations

如果是这样,这个值只在该命令提示符下有效还是全局有效?

2
你试过了吗?那段代码应该可以正常工作。然而,sys.path 的新值仅适用于您的程序($PYTHONPATH 变量仅在启动解释器以填充 sys.path 时读取,不会写回环境)。 - filmor
2个回答

88
这将为您的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。每个都有不同的环境变量集。请注意,set.py不会更改loop.py的环境,因此来自loop.py的输出不会更改。

关于导入的说明

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


但我不想在我的代码中包含路径。我希望我的代码干净且可移植。难道没有“Python项目”的概念吗?(例如Visual-studio-code或Atom.io)?! - pashute
是的,Python中“项目”的等效物是VirtualEnv。VirtualEnvWrapper是一个不错的接口工具。与Visual Studio的区别在于已经存在全局Python环境,而virtualenv只是在其上创建了一个虚拟层。可能还有其他工具,我已经离开Python几年了。 - Joe

8

正如文档这里所述。

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

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

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

此处关于site.py所述:

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

有关向sys.path添加路径的其他可能方法,请参见这些文档


但这与手动设置环境变量的值相同。我需要经常更改库路径,例如从文件中获取scriptlib路径并在使用它们之前设置它们。 - DKG
不需要在每次运行 python.exe 时都添加此值,因为在初始化期间会自动加载 site.py。因此,在每个文件中您不需要使用 import sys sys.path.append.... - pradyunsg
1
考虑这样一种情况,我有两份相同的Python脚本副本。其中一个脚本想要从C:\testers\scriptlib获取库,而另一个脚本则想要从D:\developer\scriptlib获取库。在这种情况下,site.py如何确定分配哪个路径给哪个脚本? - DKG
@DKG 在这种情况下,Python 怎么知道你指的是哪个文件?你就不应该给两个文件取相同的名字... - pradyunsg
1
啊!门打不开,因为这个傻钥匙孔是错的! - Miguel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接