Python应用程序读取和写入到其当前的工作目录作为的.app / EXE(Python app w

2019-09-22 16:30发布

我有一个python脚本读取的文本文件,在它的电流称为“data.txt中”工作目录,然后将数据转换它里面插入另一单独的程序来处理JSON格式。

我遇到的问题是,我不知道如何读的.txt文件(谱写新的一个),它是在同一目录中。应用程序时Python的脚本都捆绑起来。 目前的方法,我使用的,因为东西不起作用使用事实上,它是从终端跑,而不是作为一个执行的.app用它做什么?

任何帮助表示赞赏!

Answer 1:

在Mac上使用。应用程序启动时没有任何合理的当前工作目录。

当然,这有一定的工作目录,你可以很容易地找到它是什么在运行时由os.getcwd()您可以测试多种推出不同版本的OS X的不同的方法来找出所有的模式,但什么好处呢那你呢?

好消息是,你显然不是真的要在当前工作目录; 你所需要的。应用程序包或.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上,它很难。 一。应用程序是一个包含其他文件和目录成束的目录。 某处有一个可执行的解释和脚本的副本,并__path__将会给您后者,而不是路径。应用程序。

得到正确的方法是使用可可(或的CoreFoundation):

import Cocoa
pathToApp = Cocoa.NSBundle.mainBundle().bundlePath()

如果你不想做,你几乎必须依靠一些信息的文件说,你不能依靠和可能改变的一天。 但是,下面的代码应该是安全的:

import os
pathToApp = __file__
while not pathToApp.endswith('.app'):
  path = os.path.dirname(path)

为了使这个停止工作,无论是剧本必须是。应用程序包之外,或者你要找的人,或包内其他的.app内必须要停止被命名的.app,或者他们会必须停止被构造为正常的目录; 没有这似乎可能在OS X 10 *,甚至OS Y 11来改变。

作为一个方面的问题:你想做什么是最有可能首先是一个坏主意。 一台Mac应用程序不应该在它旁边的文件进行工作。 相反,如果用户要指望上它一起工作的文件,你可能想要一个简单的Unix可执行文件(或只是使用chmod + X的纯Python脚本),而不是应用程序。



Answer 2:

使用__file__变量。 这会给你您的模块文件名。 使用功能os.path ,你可以决定你的模块的父目录的完整路径。 该os.path模块是标准Python文档,你应该能够找到。

然后,你可以用你的文件名的模块路径结合起来,打开它,使用os.path.join



文章来源: Python app which reads and writes into its current working directory as a .app/exe