2012-08-23 92 views
2

我有一個python腳本試圖在文件系統中導入另一個腳本(路徑只在運行時知道)。 據我的理解,我需要使用IMP模塊,這可能會工作,但是當加載模塊時,我得到一個錯誤,導入模塊使用的模塊沒有找到。試圖導入* .pyc作爲模塊

繼承人的代碼:

importer.py:

import imp 
imp.load_compiled("my_module","full_path_to_my_module\\my_module.pyc") 

my_module.py:

import sys 
import another_module 

當我運行importer.py我得到htis錯誤消息:

ImportError: No module named another_module

這裏怎麼回事? 我懷疑「importer.py」被載入「my_module.pyc」 HES也試圖加載「another_module」(這就是好)時,但找錯了地方(例如,不「full_path_to_my_module」)

編輯: 我嘗試添加「full_path_to_my_module」到系統路徑:

import imp 
import sys 

sys.path.append(full_path_to_my_module) 
imp.load_compiled("my_module",full_path_to_my_module+my_module) 

但我仍然得到同樣的錯誤

也許我做了什麼,那不是必要的 - 這是我的目標: 我希望能夠到使用所有功能'importer_py'中的'my_module.pyc'。但'my_module.pyc'的位置作爲'importer.py'的參數給出。

+0

爲什麼沒有導入'my_module' '.pyc'?你真的需要在導入時再次初始化它嗎? –

回答

6

imp.load_compiled返回編譯的模塊對象,它是對import聲明,也結合了模塊的名稱

import imp 
my_module = imp.load_compiled("my_module", "full_path_to_my_module/my_module.pyc") 

然後,你可以做這樣的事情不同:

my_module.yayfunctions('a') 

完成示例會話:

$ cat /tmp/my_module.py 
def yayfunctions(a): 
    print a 
$ python -m compileall /tmp/my_module.py 
$ ls /tmp/my_module.py* 
my_module.py my_module.pyc 
$ python 
>>> import imp 
>>> my_module = imp.load_compiled("my_module", "/tmp/my_module.pyc") 
>>> my_module.yayfunctions('a') 
a 

關於編輯評論(ImportError: No module named another_module),我認爲錯誤是由my_module.pyc代碼造成的,而another_module.py生活在同一個目錄

在這種情況下,如其他人所說,這是簡單隻需添加含有my_module目錄中sys.path並使用正規的進口機制,特別是__import__

這裏是應該做一個功能你想要什麼:

import os 


def load_path(filepath): 
    """Given a path like /path/to/my_module.pyc (or .py) imports the 
    module and returns it 
    """ 

    path, fname = os.path.split(filepath) 
    modulename, _ = os.path.splitext(fname) 

    if path not in sys.path:  
     sys.path.insert(0, path) 

    return __import__(modulename) 


if __name__ == '__main__': 
    # Example usage 
    my_module = load_path('/tmp/my_module.py') 
    my_module.yayfunctions('test') 
+0

這就是我想要做的,但我得到一個導入錯誤 – AntiZamba

+0

@AntiZamba ImportError消息說什麼? – dbr

+0

ImportError:No module named another_module – AntiZamba

0

實際上您並不需要使用imp模塊來加載pyc模塊。

一個簡單的方法來嘗試它是製作兩個python模塊,一個從另一個導入並運行它。刪除導入的.py文件,只保留.pyc文件:運行該腳本時,導入將工作得很好。

但是,爲了從隨機目錄中導入py文件,您可能需要先將該目錄添加到python路徑,然後再導入它。

例如:

import sys 
sys.path.insert(0, "/home/user/myrandomdirectory") 
3

這是因爲在import another_module你 「full_path_to_my_module」 的範圍是不知道。

您是否嘗試將路徑添加到已知路徑中,即:

import sys 
sys.path.append("full_path_to_my_module") 
0

加載pyc文件的工作方式與加載py文件完全相同,除非它不執行編譯步驟。因此只要使用import mymodule就可以工作,只要pyc的版本號與您正在運行的python的版本號相同即可。否則,你會得到一個幻數錯誤。

如果模塊沒有在你的路徑,你需要將它添加到SYS - 或者,如果它的一個子目錄,一個__init__.py文件添加到該目錄..