【Python】使用exec来导入相对路径下的模块

本文纠正了之前关于Python导入机制的错误观点,探讨了使用exec执行相对导入的场景,强调了这种方式可能导致的问题。通过示例展示了sys.path的影响,并警告在项目打包时避免使用这种方法。同时介绍了XJImporter,一个修复后的相对路径导入工具,提供github链接供参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2024/1/1内容补充:

本质使用exec和sys.path,在项目打包时会造成各种问题,不建议使用。

旧内容已过时

下面的东西不用看了,看了浪费时间。(不想改单纯是因为已经打算不用优快云了,因此文章内容不再维护





因为发现自己前些天发布的博客里部分观点有很大的错误,于是就开始个纠正之路,并且又学会了一些奇怪的用法





以下为测试样例:

(只有一个黑窗口的是脚本的运行结果)
(两个黑窗口的,靠上的是脚本的,靠下的是程序的)











结论

  1. 可以向sys.path乱压路径以造成一个模块文件可以被多次执行的乱象(图6),但显然这一点意义都没有。在此纠正我之前博客里的那极其荒谬的观点:python有两种导入机制
  2. 可以使用exec来让脚本执行本不能成功执行的相对导入语句(图7.5),而相对导入能否成功的关键主要取决于变量__name__的值(图7.3),但不排除其他像是__package__等变量对相对导入的影响,所以尽量向exec传入干净的上下文环境。
  3. pyinstaller有自己的优化机制。如果你的代码里,没有明确地写出import语句,而是拐弯抹角地使用exec来import模块的话,pyinstaller不会帮你把那模块给打包进程序文件中(图8.1)。




XJImporter

之前写过一个用于相对路径导入的类,但是有重大问题(打包成项目文件后无法顺利运行),现在修好了,发个1.0.1版本的:


__version__='1.0.1'
__author__='Ls_Jan'
__all__=['XJImporter']

import sys
import os
class XJImporter:#专治各种不服
    '''
        模块导入,用于导入模块,尤其是相对路径下的导入。
        已经解决“脚本打包成程序后程序无法运行”的问题,
        只不过这就出现了别的问题:导入的模块必须在代码的某处显式地写上import(这是为了让pyinstaller能将模块打包进程序中
    '''
    def __init__(self,context):
        '''
            context为上下文环境,在创建对象时直接传入globals()即可
        '''
        self.__context=context
    def Import(self,module,args=None):
        '''
            module为模块名所在路径(不需要.py后缀),支持相对路径:
                导入上一级名为M的模块,那么module='../M'
                导入目录A下的名为M的模块,那么module='A/M'
            args为从module中导入的变量名或者变量名列表:
                如果args为空,那么仅导入模块module
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值