2016-07-17 130 views
1

我在这里有一个python模块/root/python/foo.py。我有一堆其他模块的位置,看起来像这样Python - 导入模块目录给出完整路径


    lib/ 
    | 
    ├─ module1/ 
    | ├─ __init__.py 
   | └─ bar.py 
    | 
    └─ module2/ 
     ├─ __init__.py 
     └─ bar.py 

我想从foo.py进口/root/lib/module1/root/lib/module2文件夹/root/lib/英寸我想不是必须把/root/lib/加到python系统路径中。 This stack overflow answer告诉您如何使用imp.load_source,importlib.machinery.SourceFileLoaderimportlib.util类从文件(取决于python版本)加载模块。我认为这些只在模块是单个文件时才起作用。如果我尝试这样的事情在Python 3.4

from importlib.machinery import SourceFileLoader 
problem_module = SourceFileLoader('test_mod', '/root/lib/module1').load_module() 

我得到一个IsADirectoryError

我的问题是,是否有类似的方式加载模块(因为它的完整路径),如果它是一个目录,不将整个lib/文件夹添加到系统路径?

+0

在模块1之后加''' –

+0

您需要使用'sys.path'来可靠地导入模块。看到[这个问题](http://stackoverflow.com/questions/9066777/howto-import-modules-with-dependencies-in-the-same-absolute-relative-path-with-i)。 – BrenBarn

+2

“我想不必在/ python系统路径中添加/ root/lib /。” - 为什么不?它是迄今为止最简单的方法。 – Kevin

回答

0

尝试:

from importlib.machinery import SourceFileLoader 
problem_module = SourceFileLoader('test_mod', '/root/lib/module1/__init__.py').load_module() 

__init__.py应该关心在同一个封装模块:

添加from . import bar使封装的bar.py一部分。

一些修改:

  • module1是一个包的模块。
  • bar.py是包module1
+0

这种工作。我想使用module1作为模块名称,例如我想在module1加载后从bar1导入bar.py。单独针对__init__.py不会让我这样做。 – pspencer

+0

'从。 import _bar in'__init __。py' –

+0

替代解决方案:'from .bar import *' –

1

Python没有给我们一个简单的方法来加载不能sys.path引用文件的模块部分,最常用的解决方案将做以下事情之一:

  1. 添加所需的路径sys.path
  2. 调整你的模块,这样正确的路径已经在sys.path

差不多所有其他解决方案都不会解决问题(使用非预期的方法来完成工作),有些可能会导致相当头痛。

但是Python不给我们一个修理工,让我们模仿是跨不举行sys.path文件夹摊开包,您可以通过specifying a __path__ special name模块中做到这一点:

__path__ = ["/root/lib"] 

把这一行在一个名为lib.py并将其放置在同一文件夹中foo.py要由它(在root/python/你的情况的话)进口然后从foo.py你可以这样做你所期望的:

import lib.module1 
#or 
from lib import module1 

这表明python .module1子包位于指定的__path__的某个位置,并将使用预期的导入机制从该目录(或多个目录)加载并保持您的sys.path不变。

+0

我认为你是对的,我可能只需要将'lib'文件夹添加到系统中。路径。但是,如果这是正确的方式,那么我想知道为什么python允许你导入一个模块,如果它只是一个使用'SourceFileLoader'的文件(在Python 3.4中)。如果他们有这样的功能,你会认为它不管是文件还是目录。 – pspencer

+0

读取名称...''''''''''''''''Loader''''''你没有指定**文件**,并且从源文件加载单个模块并不像整个导入机制那么简单在任何情况下,我都不会指望它工作100%。 –

+0

是的,我只是想知道为什么有一个'SourceFileLoader'时没有'SourceDirectoryLoader'方法。但我想你是对的,它不像使用导入机制那么简单。 – pspencer

相关问题