os.path在多个文件导入中使用Pyinstaller指向错误的位置

时间:2019-03-06 21:59:31

标签: python pyinstaller

我在同一目录中有两个python文件outfile = open("userInput.txt","w") userInput = int(input("Enter a number to the text file: ")) count = 0 while(userInput != -1) outfile.write(str(userInput) + "\n") userInput = int(input("Enter a number to the text file: ")) count+=1 if count == 0: print("There is no numbers in the text file") outfile.write("There is no numbers in the text file") outfile.close() main.py

aux.py包含以下代码:

main.py

import aux print "aux imported" 包含以下代码:

aux.py

现在,当我使用import os current_path = os.path.dirname(os.path.realpath(__file__)) print current_path 将main.py捆绑到.exe并尝试运行生成的main.exe时,我得到以下输出:

pyinstaller --onefile main.py

可以看出,pyinstaller使用临时文件夹定位我的aux.py,这对我来说造成了很多问题,因为实际代码中的C:\Users\vimanyua\AppData\Local\Temp\3\_MEI90~1 aux imported 会读取其当前目录中的其他同级文件。如果我像aux.py一样为aux.py创建一个.exe,它将输出正确的路径

pyinstaller --onefile aux.py

我阅读了this link的文档,并且由于我想先运行C:\Users\vimanyua\Documents\pyinstaller test\dist,所以我尝试创建一个像这样的exe文件-

aux.py

它将创建一个pyinstaller --onefile --runtime-hook=aux.py main.py,该main.exe首先运行aux.py,然后运行main.exe。当它运行aux.py时,我得到以下输出:

C:\Users\vimanyua\Documents\pyinstaller test\dist
C:\Users\vimanyua\AppData\Local\Temp\3\_MEI90~1
aux imported

我的main.py实际上使用了aux.py中的多个函数/变量,因此我无法摆脱import aux中的main.py语句,我真的不想合并代码成一个文件。

任何人都可以向我提供任何指导吗?谢谢!

1 个答案:

答案 0 :(得分:0)

请不要使用__file__来引用路径,而应使用sys._MEIPASS。 要引用aux.py文件的同级文件,请使用以下帮助函数:

import sys
import os

def resource_path(relative_path):
    """ Get absolute path to resource, works for dev and for PyInstaller """
    base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))
    return os.path.join(base_path, relative_path)

例如,如果您要在aux.py中读取名为readme.txt的同级文件,则可以将其称为:

filepath = resource_path('readme.txt')

请参阅文档here