2016-07-17 95 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

相關問題