我有一个 python 脚本,它读取当前工作目录中名为“data.txt”的文本文件,然后将其中的数据转换为 json 格式,以供另一个单独的程序处理。
我遇到的问题是,当 python 脚本全部捆绑在一起时,我不确定如何读取 .txt 文件(并编写一个新文件),该文件与 .app 位于同一目录中。我当前使用的方法不起作用,因为它是从终端运行而不是作为 .app 执行的事实?
感谢任何帮助!
最佳答案
Mac 上的 .app 启动时没有任何合理的当前工作目录。
当然它有一些工作目录,你可以在运行时通过 os.getcwd()
轻松找到它是什么。 ,并且您可以在不同版本的 OS X 上测试各种不同的启动方式以找出所有模式,但这有什么好处呢?
好消息是,您显然实际上并不需要当前工作目录;您需要 .app 包或 .exe 的目录。
换句话说,如果有人这样做:
C:\Users\foo> C:\Stuff\MyProgram.exe
您想要C:\Stuff
(可执行文件的目录),而不是 C:\Users\foo
(工作目录)。
在 Windows 上,这很容易。 .exe 只是一个文件,其路径为 __path__
你进入Python,所以:
import os
pathToApp = os.path.dirname(__path__)
在 Mac 上,这更难。 .app 是一个包 - 包含其他文件和目录的目录。其中某处有一个可执行解释器和脚本的副本,以及 __path__
将为您提供后者,而不是 .app 的路径。
正确的方法是使用 Cocoa(或 CoreFoundation):
import Cocoa
pathToApp = Cocoa.NSBundle.mainBundle().bundlePath()
如果您不想这样做,那么您几乎必须依赖文档中规定您不能依赖的某些信息,并且有一天可能会更改。但以下代码应该是安全的:
import os
pathToApp = __file__
while not pathToApp.endswith('.app'):
path = os.path.dirname(path)
为了使其停止工作,脚本必须位于 .app 包之外,或者位于您要查找的包内的另一个 .app 内,或者包必须停止被命名为 .app,或者它们必须停止被构造为普通目录;这一切在 OS X 10.* 甚至 OS Y 11 中似乎都不会改变。
作为一个附带问题:您尝试做的事情一开始很可能是一个坏主意。 Mac 应用程序不应同时处理文件。相反,如果用户希望同时处理文件,您可能需要一个简单的 Unix 可执行文件(或者只是一个带有 chmod +x 的普通 Python 脚本),而不是一个应用程序。
关于Python 应用程序以 .app/exe 形式读取并写入当前工作目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12519610/