尝试将* .pyc导入为模块

时间:2012-08-23 16:39:16

标签: python import compiled pyc

我有一个python脚本试图在文件系统中的某处导入另一个脚本(路径仅在运行时已知)。 根据我的理解,我需要使用imp模块,这可能会起作用,但是在加载模块时,我得到的错误是找不到导入模块使用的模块。

下面是代码:

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:没有名为another_module的模块

这里出了什么问题? 我怀疑当'importer.py'正在加载'my_module.pyc'时他也试图加载'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'的参数给出。

4 个答案:

答案 0 :(得分:8)

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')

答案 1 :(得分:3)

因为在import another_module的范围内你的“full_path_to_my_module”未知。

您是否尝试将路径添加到已知路径,即:

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

答案 2 :(得分:1)

您实际上不需要使用imp模块来加载pyc模块。

一个简单的方法是尝试制作两个python模块,一个从另一个导入并运行它。然后删除导入的.py文件,这样你只能得到.pyc文件:运行脚本时,导入工作正常。

但是,为了从随机目录导入py文件,您可能希望在导入之前先将该目录添加到python路径。

例如:

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

答案 3 :(得分:0)

加载pyc文件的方式与加载py文件的方式完全相同,只是它不执行编译步骤。因此,只要pyc的版本号与您正在运行的python相同,只使用import mymodule即可。否则你会得到一个幻数错误。

如果您的模块不在您的路径中,您需要将其添加到sys - 或者如果它是一个子目录,请将__init__.py文件添加到该目录中。