2011-12-29 44 views
48

我有一个充满脚本的目录(比如project/bin)。我还有一个位于project/lib的库,并希望脚本自动加载它。这是我在每个脚本的顶部通常使用:Python:相对于当前正在运行的脚本添加到sys.path的最佳方式

#!/usr/bin/python 
from os.path import dirname, realpath, sep, pardir 
import sys 
sys.path.append(dirname(realpath(__file__)) + sep + pardir + sep + "lib") 

# ... now the real code 
import mylib 

这是种累赘,丑陋,并且在每一个文件的开头要粘贴。有一个更好的方法吗?

真的就是我希望的是光滑如这样的:

#!/usr/bin/python 
import sys.path 
from os.path import pardir, sep 
sys.path.append_relative(pardir + sep + "lib") 

import mylib 

甚至更​​好,东西时,我的编辑器(或其他人谁拥有提交权限)决定重新排序,不会破进口作为其清理过程的一部分:

#!/usr/bin/python --relpath_append ../lib 
import mylib 

那不会直接移植到非POSIX平台,但它会保持干净。

+0

参见:http://stackoverflow.com/questions/2349991/python-how-to-import-other-python-files/20749411#20749411 – dreftymac 2016-05-18 22:15:59

回答

13

如果你不想要编辑的每个文件

  • 安装你的资料库像一个正常的Python libray
  • 设置PYTHONPATH到您的lib

或者如果您愿意为每个文件添加一行,请在顶部添加一条导入语句,例如

保持import_my_lib.py在bin和import_my_lib可以正确设置Python路径你想要

72

这是我用:

import os, sys 
sys.path.append(os.path.join(os.path.dirname(__file__), "lib")) 
9

创建的封装模块project/bin/lib,其中包含此无论lib

import sys, os 

sys.path.insert(0, os.path.join(
    os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'lib')) 

import mylib 

del sys.path[0], sys, os 

然后你就可以全部更换在你的脚本顶部的残余物:

#!/usr/bin/python 
from lib import mylib 
4

如果你不想改变任何方式的脚本内容,在前面加上当前工作目录.至$ PYTHONPATH(见下面的例子)

PYTHONPATH=.:$PYTHONPATH alembic revision --autogenerate -m "First revision" 

收工吧!

+0

HTTPS: //docs.python.org/3/tutorial/modules.html#the-module-search-path说:“sys.path从这些位置初始化: - 包含输入脚本的目录”。我认为这不是事实。 – jms 2017-05-14 19:27:25

9

我使用:

import sys,os 
sys.path.append(os.getcwd()) 
相关问题