kge369 发表于 2019-7-1 10:57

python 用marshal后 运行py正常,编译后exe文件提示importError

创建一个52pojie.py文件,里面是

from __future__ import unicode_literals
from concurrent.futures import ThreadPoolExecutor
import re
import sys
s ="hello/world"
new_s = re.split('/',s)
print(new_s)


首先是python -m py_compile 52pojie.py 成52pojie.pyc



然后把52pojie.pyc文件seek(8),再经过marshal 的load 和dumps,转换成scrambled_code
fd = open(r'.\52pojie.pyc', 'rb')
fd.seek(8)
import marshal
co = marshal.load(fd)
fd.close()
code_string = marshal.dumps(co)
scrambled_code = code_string.encode('zlib').encode('base64')
print scrambled_code


把prin出来的字符串eJxFT8tOwzAQHCdNCNBD1B/gmlMrirgghDiA4IRQ4UIUyariRU3lxpUfKj3z4bBOi1jbo9nZ9Xjd
4hgpn3skcB9MFG8BDWwEagER8wQ6wSZFnR7yFHqEeoQjz1BnUKzkoBHWJ1AZKMd3groAFXh65q63
Kmf37oejEsx8yRD6rjWKpO482aV2h8qE4X1laalejdGPX9QGb+xLOGd9RVqb2c5YrUJsnlWn8coZ
g5SfwQdLUi7wZ9Oavg3WUu+nh6JbDE8kDJZ8/LnbOx8157OIW55lYD3tpKui0z+4C4aHm+ZyftVs
935l+sYPgzbX861ZdzRlteCe241RQdPdYDxmKEUpxrxyMRG/7VFOuQ==,创建新的new_52pojie.py文件,里面是


scrambled_code_string='''eJxFT8tOwzAQHCdNCNBD1B/gmlMrirgghDiA4IRQ4UIUyariRU3lxpUfKj3z4bBOi1jbo9nZ9Xjd
4hgpn3skcB9MFG8BDWwEagER8wQ6wSZFnR7yFHqEeoQjz1BnUKzkoBHWJ1AZKMd3groAFXh65q63
Kmf37oejEsx8yRD6rjWKpO482aV2h8qE4X1laalejdGPX9QGb+xLOGd9RVqb2c5YrUJsnlWn8coZ
g5SfwQdLUi7wZ9Oavg3WUu+nh6JbDE8kDJZ8/LnbOx8157OIW55lYD3tpKui0z+4C4aHm+ZyftVs
935l+sYPgzbX861ZdzRlteCe241RQdPdYDxmKEUpxrxyMRG/7VFOuQ=='''
exec __import__('marshal').loads(scrambled_code_string.decode('base64').decode('zlib'))


以上的方法是百度找到的。


运行new_52pojie.py文件,可以打印


但是编译成.exe文件,就提示import Error No module namedconcurrent.futures

把from 开头的这2条注释掉,再编译,是能正常运行exe文件的,求助,如果需要concurrent.futures,怎么不提示错误呢



ixsec 发表于 2019-7-1 12:06

编译exe为何不用pyinstaller 打包成exe

冥界3大法王 发表于 2019-7-1 12:18

ixsec 发表于 2019-7-1 12:06
编译exe为何不用pyinstaller 打包成exe

因为那个生成的文件大了 7倍 ,不信你试试。{:301_1006:}
1.安装pyinstaller
cmd命令行下
cd /d E:\Python37\Scripts
pip install pyinstaller
2.安装pywin32, 下载对应的版本:
https://nchc.dl.sourceforge.net/project/pywin32/pywin32/Build%20221/pywin32-221.win-amd64-py3.7.exe

准备工作已经完成,接下来回到命令提示符,转到你的python的scripts目录下输入
pyinstaller  -F  d:\python\login.py

其中-F为参数,可以写多个,如pyinstaller.py -F -w  C:\python\login.py
参数        含义
-F        指定打包后只生成一个exe格式的文件
-D        –onedir 创建一个目录,包含exe文件,但会依赖很多文件(默认选项)
-c        –console, –nowindowed 使用控制台,无界面(默认)
-w        –windowed, –noconsole 使用窗口,无控制台
-p        添加搜索路径,让其找到对应的库。
-i        改变生成程序的icon图标
D:\python\login.py为你所要转换的文件的路径及文件名,也可以把py文件放在python路径下的scripts路径下,
这样就可以省略路径,直接写文件名login.py
等待运行结束,若没有错误,EXE文件会创建在python安装路径的Scripts文件夹中的dist文件夹内,如D:\python\Scripts\dist。
此时就可以直接运行EXE文件了
https://blog.csdn.net/yufen9987/article/details/73865281/

kge369 发表于 2019-7-1 12:18

ixsec 发表于 2019-7-1 12:06
编译exe为何不用pyinstaller 打包成exe

这个pyinstaller打包成exe,和编译成exe,是一个意思吧,我百度python 编译exe的话,就是pyinstaller和另外一个

kge369 发表于 2019-7-1 12:31

冥界3大法王 发表于 2019-7-1 12:18
ixsec 发表于 2019-7-1 12:06
编译exe为何不用pyinstaller 打包成exe



编译和pyinstaller打包,是有区别的???不过我的问题是另外一个

ixsec 发表于 2019-7-1 13:34

kge369 发表于 2019-7-1 12:31
编译和pyinstaller打包,是有区别的???不过我的问题是另外一个

不晓得什么问题 我用python 3.7.3 运行你的代码各种出错。。。。。

kge369 发表于 2019-7-1 13:37

ixsec 发表于 2019-7-1 13:34
不晓得什么问题 我用python 3.7.3 运行你的代码各种出错。。。。。

忘了第一个是import的话,需要先pip

ixsec 发表于 2019-7-1 13:41

kge369 发表于 2019-7-1 13:37
忘了第一个是import的话,需要先pip

fd = open(r'.\52pojie.pyc', 'rb')
fd.seek(8)
import marshal
co = marshal.load(fd)
fd.close()
code_string = marshal.dumps(co)
scrambled_code = code_string.encode('zlib').encode('base64')
print scrambled_code

这个 一直出错~~ 各种错误都有。。

ixsec 发表于 2019-7-1 13:44

ValueError: bad marshal data (unknown type code)   头大。。。。

kge369 发表于 2019-7-1 14:02

本帖最后由 kge369 于 2019-7-1 14:05 编辑

ixsec 发表于 2019-7-1 13:44
ValueError: bad marshal data (unknown type code)   头大。。。。
哎,我不知道什么时候把fd.seek(8) 给弄没了,在import之前,有行这个,没有检查仔细,我上面的描述是有seek的,晕倒
页: [1] 2
查看完整版本: python 用marshal后 运行py正常,编译后exe文件提示importError