尝试将*.pyc导入为模块

Ant*_*mba 3 python import compiled pyc

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

下面是代码:

importer.py:

import imp
imp.load_compiled("my_module","full_path_to_my_module\\my_module.pyc")
Run Code Online (Sandbox Code Playgroud)

my_module.py:

import sys
import another_module
Run Code Online (Sandbox Code Playgroud)

当我运行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)
Run Code Online (Sandbox Code Playgroud)

但我仍然得到同样的错误

也许我做了一些不必要的事情 - 这是我的目标:我希望能够在'importer.py'中使用'my_module.pyc'的所有功能.但'my_module.pyc'的位置作为'importer.py'的参数给出.

dbr*_*dbr 8

imp.load_compiled返回已编译的模块对象,它import与将模块绑定到名称的语句不同

import imp
my_module = imp.load_compiled("my_module", "full_path_to_my_module/my_module.pyc")
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

my_module.yayfunctions('a')
Run Code Online (Sandbox Code Playgroud)

完成示例会话:

$ 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
Run Code Online (Sandbox Code Playgroud)

关于comment(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')
Run Code Online (Sandbox Code Playgroud)