2024/1/1内容补充:
本质使用exec和sys.path,在项目打包时会造成各种问题,不建议使用。
旧内容已过时
下面的东西不用看了,看了浪费时间。(不想改单纯是因为已经打算不用优快云了,因此文章内容不再维护
因为发现自己前些天发布的博客里部分观点有很大的错误,于是就开始个纠正之路,并且又学会了一些奇怪的用法
以下为测试样例:
(只有一个黑窗口的是脚本的运行结果)
(两个黑窗口的,靠上的是脚本的,靠下的是程序的)
结论
- 可以向sys.path乱压路径以造成一个模块文件可以被多次执行的乱象(图6),但显然这一点意义都没有。在此纠正我之前博客里的那极其荒谬的观点:python有两种导入机制
- 可以使用exec来让脚本执行本不能成功执行的相对导入语句(图7.5),而相对导入能否成功的关键主要取决于变量
__name__
的值(图7.3),但不排除其他像是__package__
等变量对相对导入的影响,所以尽量向exec传入干净的上下文环境。 - 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