加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 尝试将* .pyc导入为模块

发布时间:2020-12-20 12:20:51 所属栏目:Python 来源:网络整理
导读:我有一个 python脚本试图在文件系统中的某个地方导入另一个脚本(路径只在运行时知道). 根据我的理解,我需要使用imp模块,这可能会起作用,但是在加载模块时,我得到的错误是找不到导入模块使用的模块. 下面是代码: importer.py: import impimp.load_compiled(
我有一个 python脚本试图在文件系统中的某个地方导入另一个脚本(路径只在运行时知道).
根据我的理解,我需要使用imp模块,这可能会起作用,但是在加载模块时,我得到的错误是找不到导入模块使用的模块.

下面是代码:

importer.py:

import imp
imp.load_compiled("my_module","full_path_to_my_modulemy_module.pyc")

my_module.py:

import sys
import another_module

当我运行importer.py时,我收到htis错误消息:

ImportError: No module named 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’的参数给出.

解决方法

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:没有名为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')

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读