2012-08-23 58 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文件添加到该目录..