Python 应用程序以 .app/exe 形式读取并写入当前工作目录

标签 python file io exe .app

我有一个 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/

相关文章:

python - 使用字典查找文件中单词出现的行号

c++ - 在 Linux C++ 中终止阻塞 IO

linux - 使用 cgroup 限制 IO 使用

python - 从文件导入和使用 JSON 字符串时出现 ValueError

Java 对象输入流 : How to check for new data?

python - Django:在admin list_display中显示相关对象的数量

python - 消除列表中的重复元素

python - 具有分类特征的线性回归分析

string - 将包含字符串的行复制到shell脚本中的另一个文件

file - 如何从 dired 模式创建新文件?