3

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

继承人的代码:

进口商.py:

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

我的模块.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

4 回答 4

9

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_modulesys.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')
于 2012-08-23T16:43:37.160 回答
3

这是因为在import another_module您的“full_path_to_my_module”范围内是未知的。

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

import sys
sys.path.append("full_path_to_my_module")
于 2012-08-23T16:43:27.083 回答
1

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

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

但是,对于从随机目录导入 py 文件,您可能需要先将该目录添加到 python 路径,然后再导入它。

例如:

import sys
sys.path.insert(0, "/home/user/myrandomdirectory")
于 2012-08-23T16:43:06.430 回答
0

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

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

于 2012-08-23T16:44:09.383 回答