python小白求助
本帖最后由 shr123 于 2022-12-14 10:08 编辑纯小白
1.python用pyinstaller导出exe很慢且文件很大,试了网上的创建纯净环境还是一样,我看到易语言等编程语言导出的exe有的甚至不到1m,python该怎么做到
2.在编辑器里直接跑程序,调取本地路径文件的时候,没什么问题,我的py文件在桌面,程序会在桌面找文件
导出exe之后,就会自动跑到“C:\Users\Administrator\AppData\Local\Temp\_MEIxxxxx\”去找文件,结果就是找不到我指定的文件
各位大佬有办法吗
3.python在命令行里如何实现按任意键退出,求代码
4.py打包出来的程序为啥不能在OD里跑,显示不是一个32位PE文件 顺便问一下,我py打包出来的程序为啥不能在OD里跑,显示不是一个32位PE文件 python不咋适合打包exe,你的库整多了不管咋打包都大
还是go或者rust之类的好点 第三个问题 在已经进入到python解释器的情况下 在命令行中输入exit() 然后按Enter (回车键) 就退出python解释器了 加上-w就好了
本帖最后由 冬酒暖阳 于 2022-12-13 23:11 编辑
1. python 打包的这个问题你是用了很多第三方库吗,这个问题大概没有很好的解决方法,因为pyinstaller的打包方式就是把整个环境都打包到exe里,包括python和你安装的第三方库
2. 这个问题得看你的具体需求,你是想让需要读取的文件还是保存在桌面上,然后你还是从桌面去读取,那你就把打包好的程序放到桌面上就好,是可以用相对路径的,如果你想把程序放到其他的地方,不想放到桌面,同时文件还继续放在桌面。那就在程序里通过下面的代码获取到桌面的路径
os.path.join(os.path.expanduser("~"), 'Desktop')
3. 在python里实现按回车键退出程序简单,但是按任意键就有点复杂。如果局限在 windows 系统上,你可以引入 os 这个库,然后执行 os.system('pause') 这个语句,就能实现你的需求
import os
os.system('pause') 本帖最后由 hrpzcf 于 2022-12-13 23:39 编辑
Python打包的原理就是把源码和运行环境打包到一个exe文件里。如果打包成单个exe文件,运行时它首先会将环境和Python文件解压到系统临时文件夹(也就是你说的那个路径)里再运行,如果你想把资源文件打包进exe那就用--add-data打包参数,如果你想让程序在exe所在目录找资源,那代码中就用 os.path.dirname(__file__)获取当前代码文件(打包后获取到的是虚拟pyc文件所在目录,如果程序只有一个文件,那虚拟pyc文件所在目录就等同于exe文件所在目录)所在目录,而且打包成单文件、单目录、不打包,通过各个方法获取到的路径也有些区别,具体如何使用好pyinstaller要去看它的文档,一两句话是说不清楚的。 本帖最后由 shr123 于 2022-12-14 00:45 编辑
冬酒暖阳 发表于 2022-12-13 22:55
1. python 打包的这个问题你是用了很多第三方库吗,这个问题大概没有很好的解决方法,因为pyinstaller的打 ...
你是想让需要读取的文件还是保存在桌面上,然后你还是从桌面去读取,那你就把打包好的程序放到桌面上就好,是可以用相对路径的
os.path.dirname(__file__)
我的代码是这个,我的程序和文件都在桌面上,但是他获取到的是临时文件夹里的路径,是不是程序是否放在桌面上都要用你提供的这个代码
或者说 打包的时候什么方式能让我那串代码获取到文件所在路径的文件 hrpzcf 发表于 2022-12-13 23:37
Python打包的原理就是把源码和运行环境打包到一个exe文件里。如果打包成单个exe文件,运行时它首先会将环境 ...
我把他的所有需要的文件全打包出来就不会生成临时文件夹了吧,是不是那样我获取到的路径就是程序所在的路径了 cflying 发表于 2022-12-13 22:32
python不咋适合打包exe,你的库整多了不管咋打包都大
还是go或者rust之类的好点
那你比较推荐哪个 等我py学有所成之后我可以考虑转行{:301_997:} 本帖最后由 hrpzcf 于 2022-12-14 02:06 编辑
shr123 发表于 2022-12-14 00:05
我把他的所有需要的文件全打包出来就不会生成临时文件夹了吧,是不是那样我获取到的路径就是程序所在的路 ...
会生成临时文件夹的,这是打包原理决定的
如果你的程序只有一个 py 文件,那你想要实现打包后访问exe同目录的资源文件的话,可以这样:
def get_path(*rel_paths):
if getattr(sys, "frozen", False):
start_point = os.path.dirname(sys.executable)
else:
start_point = os.path.dirname(__file__)
return os.path.join(start_point, *rel_paths)
# 通过这个函数获取文件路径
p1 = get_path("文件.txt") # 文件.txt 与源码或打包后的exe在同一文件夹下
p2 = get_path("abc", "文件.txt") # 文件.txt 在源码或打包后的exe同一目录下的 abc 文件夹里