使用py2app将.py转换为.app。起初,它看起来很好,但当我执行open()和f.write(如下所示)来创建.txt时,它不会创建文件。
py2app
.py
.app
open()
f.write
.txt
f = open(name + ".txt", "w") f.write("users inputs here")
当我以.py的身份运行程序时,这绝对可以正常工作任何人有任何想法,我似乎找不到任何东西在那里解释为什么会发生这种情况。
uhry853o1#
问题在于,当应用从Finder启动时,当前目录被设置为/,因此路径相对于/,而不是应用捆绑包。要获取Python exe的路径,请尝试sys.executable。注意,您可能需要添加../../以退出Contents/MacOS目录。但是,更好的解决方案可能是简单地使用文件对话框,允许用户选择保存位置。
/
sys.executable
../../
Contents/MacOS
xt0899hw2#
我的程序也遇到了同样的问题,我打开一个文件,并将列标题写入该文件,然后在程序中循环迭代数据。当应用程序转换为.app时,程序将在到达将列标题写入文件时失败。如果我将其注解掉,它会工作得很好。我删除了列标题文本中的所有特殊字符,它工作得很好。不确定这是为什么。不起作用:
file.write("\n" + "Image" + "\t" + "x (pxl)" + "\t" + "y (pxl)" + "\t" + "radius (ID; µm)" + "\t" + "GlobalThresh Reported:" + "\n")
作品:
file.write("\n" + "Image" + "\t" + "x" + "\t" + "y" + "\t" + "radius" + "\t" + "GlobalThresh Reported" + "\n")
bttbmeg03#
一个实现sys.executable的实用解决方案,如@nneonneo状态可以是这样一个;这对我很有效
location = os.path.abspath( os.path.join(sys.executable + "/file_name", '..', '..', '..', '..','..', "file_name"))
它打印文件一级以上的.app文件夹
vyswwuz24#
我遇到了同样的问题。启动 /dist/Appname.app/Contents/MacOS/Appname时,应用程序运行正常:打开文件,截断文件,写入新内容,然后关闭文件。启动应用程序本身不知何故失败与open(file=os.path.expanduser(outputPath), mode="w"),只是产生了一个空文件。将encoding="utf-8"添加到open语句解决了这个问题。我只是在查看我正在使用的open as对象时才注意到-突然它变成了encoding='US-ASCII'
open(file=os.path.expanduser(outputPath), mode="w")
encoding="utf-8"
open
open as
encoding='US-ASCII'
4条答案
按热度按时间uhry853o1#
问题在于,当应用从Finder启动时,当前目录被设置为
/
,因此路径相对于/
,而不是应用捆绑包。要获取Python exe的路径,请尝试
sys.executable
。注意,您可能需要添加../../
以退出Contents/MacOS
目录。但是,更好的解决方案可能是简单地使用文件对话框,允许用户选择保存位置。
xt0899hw2#
我的程序也遇到了同样的问题,我打开一个文件,并将列标题写入该文件,然后在程序中循环迭代数据。当应用程序转换为.app时,程序将在到达将列标题写入文件时失败。如果我将其注解掉,它会工作得很好。我删除了列标题文本中的所有特殊字符,它工作得很好。不确定这是为什么。
不起作用:
作品:
bttbmeg03#
一个实现sys.executable的实用解决方案,如@nneonneo状态可以是这样一个;这对我很有效
它打印文件一级以上的.app文件夹
vyswwuz24#
我遇到了同样的问题。
启动 /dist/Appname.app/Contents/MacOS/Appname时,应用程序运行正常:打开文件,截断文件,写入新内容,然后关闭文件。
启动应用程序本身不知何故失败与
open(file=os.path.expanduser(outputPath), mode="w")
,只是产生了一个空文件。将
encoding="utf-8"
添加到open
语句解决了这个问题。我只是在查看我正在使用的
open as
对象时才注意到-突然它变成了encoding='US-ASCII'