为了保护源码,防止反编译,有时候会先将py编译成pyd,再使用pyinstaller进行打包。根据现有资料,已知被编译成pyd的文件它们所导入的模块,在打包时不会被引入,所以需要一个.py格式的入口文件,将这些pyd文件导入的模块在入口文件中import进来。

      关于这些我今天思考了一个问题,我有这样一个项目,有入口main.py,模块a.py、 b.py、 c.py。引用关系是这样的:

 1. main导入a,在a中直接执行主程序代码,main只是为了后续导入模块而服务的;

2. a导入并执行写在b和c当中的两个类;

3. b是写好的一个类,c导入b并继承了这个类,进行了一些属性和方法的修改。

        关于上述引用关系,我想证明只要在main.py中导入了 a、b、c三个文件和它们本身用到的库,程序就可以跑,不需要过多考虑a、b、c之间的相互导入关系(想多了费脑筋,操作起来越简单越好)。

        为了这明这个猜想,我进行了测试。我将abc三个文件编译成pyd,然后在main.py中导入了它们,和它们依赖的库,唯一需要注意的是a是执行主程序的,所以我把导入a放在了最后,确保其他模块先加载完成,再执行a,避免报变量未定义的错。

        经测试,按照上述方法导入文件,打包出来的程序可以正常运行,说明只要在入口按照程序执行顺序导入这些文件和它们依赖的库,就可以在内存中加载到这些方法属性。至于后面这些文件之间,他们是怎么相互调用的,在写py文件的时候捋清楚就可以了。在打包阶段可以将问题简化为:一共有哪些文件要导入,通通导入到入口的py文件,然后跑主程序是哪一个,将它放到最后导入即可。

      上述的简化思维只适用于只有一个文件调用运行其他所有文件的情况,如果有其他更复杂的执行结构,则需要更多地注意导入顺序,总之就是应避免变量未定义的错误。

       以上纯属个人经验之谈,如有谬误,请批评指正。