Python and Pyinstaller: include binary application in code
我有一个小应用程序。 为了保护我使用c:/hwid.exe。 应用程序返回pc的HWID。 示例代码:
1 2 3 4 5 6 7 8 9 10 11 | def HWID_LIC(): try: if hashlib.md5(open('c:\hwid.exe', 'rb').read()).hexdigest() != 'bca173dc': sys.exit(1) out = os.popen("c:\hwid.exe").read().strip() if out not in lic: sys.exit(1) except: sys.exit(1) HWID_LIC() |
我想在我的应用程序中包含hwid.exe,并且需要将解决方案全部放在一个文件中。 可以用Python做到这一点吗? hwid.exe有30 kb。
这个有可能。 您需要在sys._MEIPASS中搜索hwid.exe
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import sys import os import hashlib def HWID_LIC(): if os.path.isfile('hwid.exe'): print('file found in .') else: print('file not found in .') if os.path.isfile(sys._MEIPASS + os.sep + 'hwid.exe'): print('file found in sys._MEIPASS') else: print('file not found') print(hashlib.md5(open(sys._MEIPASS + os.sep + 'hwid.exe', 'rb').read()).hexdigest()) if __name__ == '__main__': HWID_LIC() |
示例spec文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | # -*- mode: python -*- a = Analysis(['test.py'], pathex=[], hiddenimports=[], runtime_hooks=None) import platform if platform.system().find("Windows")>= 0: a.datas = [i for i in a.datas if i[0].find('Include') < 0] a.binaries = [x for x in a.binaries if not x[0].startswith("scipy")] a.binaries = [x for x in a.binaries if not x[0].startswith("numpy")] a.datas += [('hwid.exe','.\\hwid.exe','DATA'),] pyz = PYZ(a.pure) exe = EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas, name='test.exe', debug=False, strip=None, clean=True, upx=False, console=True) |
并创建onefile exe whith
1 | pyinstaller t_onefile.spec |
执行test.exe时,您会看到:
1 2 3 4 | j:\tmp>test.exe file not found in . file found in sys._MEIPASS 754222d71581010a45732c471437ecf7 |