Python Django绝对进口

Python Django绝对进口,python,django,import,module,package,Python,Django,Import,Module,Package,假设有一个名为foobar的系统级模块,还有一个名为foobar的django应用程序,我无法编辑它们,因为它们都是外部项目 现在,我想使用system foobar模块,而不是应用程序,但它不起作用: $ python --version Python 2.7.3 $ ./manage.py --version 1.3.1 $ ./manage.py shell >>> import foobar >>> print (foobar) <modul

假设有一个名为
foobar
的系统级模块,还有一个名为
foobar
的django应用程序,我无法编辑它们,因为它们都是外部项目

现在,我想使用system foobar模块,而不是应用程序,但它不起作用:

$ python --version
Python 2.7.3

$ ./manage.py --version
1.3.1

$ ./manage.py shell
>>> import foobar
>>> print (foobar)
<module 'foobar' from '/path/to/myproject/foobar/__init__.pyc'>
$python--版本
Python 2.7.3
$./manage.py--版本
1.3.1
$./manage.py shell
>>>导入foobar
>>>打印(foobar)

我该怎么办?我想我应该选择

Python在环境变量
PYTHONPATH
中定义的位置查找包。您可以很容易地从Python中修改此内容:

您需要更改
sys.path
,以便包含系统foobar模块的目录位于应用程序目录之前

假设您的
sys.path
如下所示:

>>> import sys
>>> sys.path
['', '/usr/local/lib/python2.7/site-packages']
foobar
同时位于当前工作目录(用
'
表示)和系统
站点软件包
目录中,您希望使系统
foobar
更靠近列表的前面:

>>> sys.path.insert(0, '/usr/local/lib/python2.7/site-packages/foobar')
>>> sys.path
['/usr/local/lib/python2.7/site-packages/foobar', 
 '', '/usr/local/lib/python2.7/site-packages']
请注意,对路径的更改只适用于正在运行的Python进程/实例(在本例中为交互式会话),以后的进程将使用原始路径启动

不修改路径的解决方案 如果您不能或不想修改sys.path,可以使用该模块手动导入模块:

import imp

name = 'foobar'
path = '/usr/local/lib/python2.7/site-packages/foobar'

fp, pathname, description = imp.find_module(name, path)
try:
    imp.load_module(name, fp, pathname, description)
finally:
    # Make sure the file pointer was closed:
    if fp:
        fp.close()
仅临时修改路径的解决方案 此解决方案不需要提前知道system
foobar
软件包的位置,只需要知道当前目录中不存在的软件包:

import imp
import sys

# Temporarily remove the current working directory from the path:
cwd = sys.path.pop(0)

# Now we can import the system `foobar`:
import foobar

# Put the current working directory back where it belongs:
sys.path.insert(0, cwd)

试试这个,没有硬代码路径

import os
import sys
PROJECT_DIR = os.path.dirname(__file__) 
# make sure the path is right, it depends on where you put the file is

# If PROJECT_DIR in sys.path, remove it and append to the end.
syspath = sys.path
syspath_set = set(syspath)
syspath_set.discard(PROJECT_DIR)
sys.path = list(syspath_set)

sys.path.append(PROJECT_DIR)

# Then try
import foobar

# At last, change it back, prevent other import mistakes
sys.path = syspath

我是否正确理解了这一点-您已通过将其解压缩到项目文件夹中安装了外国应用程序?为什么你要通过导入foobar来使用它,而不是导入myproject.foobar?foobar应用程序更像是一个子模块。问题是我无法编辑它,我正在寻找如何导入系统模块,而不是应用程序。我只需要加载系统范围的foobar在这种情况下,通常我处理foobar应用程序。另外,改变整个路径可能会带来我无法控制的副作用。你的解决方案似乎有点过分吗?另外,我使用交互式会话只是为了解释我的问题,但我需要一个真正的django应用程序文件中的解决方案。你的第二个解决方案似乎令人满意,但艰难的道路很烦人。它可能因操作系统或python版本的不同而有所不同。这很公平!我添加了另一个可能的解决方案,它不需要硬编码路径。