1. 获取文件执行路径py脚本2. 分别在不同的文件下执行,查看结果3. 总结
1. 获取文件执行路径py脚本
又要打包程序了, 然后就是遇到问题了, 最后解决问题.
在这里就是为了说下使用pyinstaller打包exe后, 获取文件路径异常的问题.
首先需要知道:
-
sys.argv[0]: 运行时, python后面的参数
-
sys.path[0]: 只要模块的绝对路径目录
-
Path(file): 显示文件在执行是的所在目录 查看脚本文件T.py
import sys import os from pathlib import Path
def main(): print("sys.argv[0]: ".ljust(35), sys.argv[0]) print("os.path.realpath(sys.argv[0]): ".ljust(35), os.path.realpath(sys.argv[0])) print("sys.path[0]: ".ljust(35),sys.path[0]) print("os.path.realpath(sys.path[0]): ".ljust(35), os.path.realpath(sys.path[0])) print("Path(sys.executable): ".ljust(35), Path(sys.executable)) print("os.getcwd(): ".ljust(35), os.getcwd()) print("Path(__file__): ".ljust(35), Path(__file__)) if __name__ == "__main__": main() ``` - 执行pyinstaller -F T.py 生成一个可执行文件, T.exe的路径: ```txt T.exe: D:\work\python_code\dist\T.exe ``` - 执行pyinstaller -D T.py 生成可执行文件夹, T.exe的路径: ```txt T.exe: D:\work\python_code\dist\T\T.exe ``` - T.py绝对路径如下: ```txt T.py: D:\work\python_code\T.py ```
2. 分别在不同的文件下执行,查看结果
-
执行<pyinstaller -D T.py>生成的exe文件
# 直接执行T.exe PS D:\work\python_code\dist\T> .\T.exe sys.argv[0]: D:\work\python_code\dist\T\T.exe os.path.realpath(sys.argv[0]): D:\work\python_code\dist\T\T.exe sys.path[0]: D:\work\python_code\dist\T\base_library.zip os.path.realpath(sys.path[0]): D:\work\python_code\dist\T\base_library.zip Path(sys.executable): D:\work\python_code\dist\T\T.exe os.getcwd(): D:\work\python_code\dist\T Path(__file__): D:\work\python_code\dist\T\T.py # 在T.exe的上上级目录下执行.\dist\T\T.exe PS D:\work\python_code> .\dist\T\T.exe sys.argv[0]: D:\work\python_code\dist\T\T.exe os.path.realpath(sys.argv[0]): D:\work\python_code\dist\T\T.exe sys.path[0]: D:\work\python_code\dist\T\base_library.zip os.path.realpath(sys.path[0]): D:\work\python_code\dist\T\base_library.zip Path(sys.executable): D:\work\python_code\dist\T\T.exe os.getcwd(): D:\work\python_code Path(__file__): D:\work\python_code\dist\T\T.py # 将T文件复制到其他文件下执行T.exe C:\Users\xxx\Desktop\win\T>T.exe sys.argv[0]: T.exe os.path.realpath(sys.argv[0]): C:\Users\xxx\Desktop\win\T\T.exe sys.path[0]: C:\Users\xxx\Desktop\win\T\base_library.zip os.path.realpath(sys.path[0]): C:\Users\xxx\Desktop\win\T\base_library.zip Path(sys.executable): C:\Users\xxx\Desktop\win\T\T.exe os.getcwd(): C:\Users\xxx\Desktop\win\T Path(__file__): C:\Users\xxx\Desktop\win\T\T.py
在上面结果中可以看出:
-
1). os.path.realpath(sys.argv[0]): 是T.exe执行目录的绝对路径 均相同
-
2). os.path.realpath(sys.path[0]): 是T.exe执行时, python库压缩文件目录 均相同
-
3). Path(sys.executable): 是T.exe执行目录的绝对路径 均相同
-
4). os.getcwd(): 是T.exe的工作目录 不相同
-
5). Path(__file__): 是T.exe执行时,生成的执行文件T.py所在的目录 均相同
-
-
执行<pyinstaller -F T.py>生成的exe文件
# 直接执行T.exe D:\rdc_work\python_code\dist>T.exe sys.argv[0]: T.exe os.path.realpath(sys.argv[0]): D:\rdc_work\python_code\dist\T.exe sys.path[0]: C:\Users\xxx\AppData\Local\Temp\_MEI172642\base_library.zip os.path.realpath(sys.path[0]): C:\Users\xxx\AppData\Local\Temp\_MEI172642\base_library.zip Path(sys.executable): D:\rdc_work\python_code\dist\T.exe os.getcwd(): D:\rdc_work\python_code\dist Path(__file__): C:\Users\xxx\AppData\Local\Temp\_MEI172642\T.py # 在T.exe的上上级目录下执行.\dist\T\T.exe C:\Users\xxx\Desktop\win>T.exe sys.argv[0]: T.exe os.path.realpath(sys.argv[0]): C:\Users\xxx\Desktop\win\T.exe sys.path[0]: C:\Users\xxx\AppData\Local\Temp\_MEI229962\base_library.zip os.path.realpath(sys.path[0]): C:\Users\xxx\AppData\Local\Temp\_MEI229962\base_library.zip Path(sys.executable): C:\Users\xxx\Desktop\win\T.exe os.getcwd(): C:\Users\xxx\Desktop\win Path(__file__): C:\Users\xxx\AppData\Local\Temp\_MEI229962\T.py # 将T.exe文件复制到其他文件下执行T.exe C:\Users\xxx\Desktop>win\T.exe sys.argv[0]: win\T.exe os.path.realpath(sys.argv[0]): C:\Users\xxx\Desktop\win\T.exe sys.path[0]: C:\Users\xxx\AppData\Local\Temp\_MEI172642\base_library.zip os.path.realpath(sys.path[0]): C:\Users\xxx\AppData\Local\Temp\_MEI172642\base_library.zip Path(sys.executable): C:\Users\xxx\Desktop\win\T.exe os.getcwd(): C:\Users\xxx\Desktop Path(__file__): C:\Users\xxx\AppData\Local\Temp\_MEI172642\T.py
在上面结果中可以看出:
-
1). os.path.realpath(sys.argv[0]): 是T.exe执行目录的绝对路径, 均相同
-
2). os.path.realpath(sys.path[0]): 是T.exe执行时, 生成的一个python库压缩文件目录 均相同
-
3). Path(sys.executable): 是T.exe执行目录的绝对路径 均相同
-
4). os.getcwd(): 是T.exe的工作目录 不相同
-
5). Path(__file__): 是T.exe执行时,生成的执行文件T.py所在的目录 均相同
-
-
执行T.py
# 在T.py的所在目录下执行 PS D:\work\python_code> python .\T.py sys.argv[0]: .\T.py os.path.realpath(sys.argv[0]): D:\work\python_code\T.py sys.path[0]: D:\work\python_code os.path.realpath(sys.path[0]): D:\work\python_code Path(sys.executable): C:\Users\xxx\.virtualenvs\python_code-y2WbWbrA\Scripts\python.exe os.getcwd(): D:\work\python_code Path(__file__): T.py # 在其他文件夹下执行T.py PS D:\work\python_code\dist\T> python -u "d:\work\python_code\T.py" sys.argv[0]: d:\work\python_code\T.py os.path.realpath(sys.argv[0]): D:\work\python_code\T.py sys.path[0]: d:\work\python_code os.path.realpath(sys.path[0]): D:\work\python_code Path(sys.executable): C:\Users\xxx\.virtualenvs\python_code-y2WbWbrA\Scripts\python.exe os.getcwd(): D:\work\python_code\dist\T Path(__file__): d:\work\python_code\T.py
在上面结果中可以看出:
-
1). os.path.realpath(sys.argv[0]): 是T.py执行目录的绝对路径, 均相同
-
2). os.path.realpath(sys.path[0]): 是T.py执行时, 所在上一级文件的绝对路径 均相同
-
3). Path(sys.executable): 是T.py执行时, pyhton程序的绝对路径 均相同
-
4). os.getcwd(): 是T.py的工作目录 不相同
-
5). Path(__file__): 是T.py执行时, T.py所在的目录 均相同
-
3. 总结
1). os.path.realpath(sys.argv[0]): 是T.py/T.exe执行目录的绝对路径 2). os.path.realpath(sys.path[0]): 是T.py执行时, 所在上一级文件的绝对路径 3). Path(sys.executable): 执行T.py时, pyhton.exe的绝对路径, 执行T.exe时, T.exe的绝对路径 4). os.getcwd(): 是T.py/T.exe的工作目录 5). Path(__file__): 是[T.py]/[T.exe生成T.py]执行时, T.py所在的目录 在py文件在打包前后,同样的获取文件路径的方式,获取的结果, 可能不同, 就会造成读取某些配置文件异常 因此,
-
可以使用os.path.realpath(sys.argv[0]), 可以在打包前后获取py/exe文件的绝对路径
-
打包时, 可以使用Path(sys.executable),获取exe的执行路径
-
可以在代码中指定工作目录, 然后根据工作目录, 获取某些配置文件