0

我是 bukkit 插件编码器,我一直在制作配置文件。我想用来__file__定位 .py 文件的当前目录...我在谷歌上搜索并看到了sys.argv[0],但正如我所见,它仅适用于 Windows 用户,我希望它与每个操作系统兼容,如果我错了,你能给我一个例子吗?

这是我的代码:

def onEnable(self):
    pluginlokacija1 = os.path.realpath(__file__)
    if os.path.isfile("%s/Halloween/config.yml"%pluginlokacija1):
        pass
    else:
        os.mkdir("%s/Halloween/"%pluginlokacija1)
        self.createConfig()
        self.findFolder()
        self.cfg = YamlConfiguration.loadConfiguration(File(os.path.join(self.folder,"config.yml")))
        itemlist = self.cfg.getString("main.itemlist")
        print ("Rezultat: %s" % itemlist)

def createConfig(self):
    pluginlokacija2 = os.path.realpath(__file__)
    fo = open("%s/Halloween/config.yml"%pluginlokacija2, "wb")
    fo.write( "main:\n itemlist: 172\n candydropchance: 50");
    fo.close

错误:

14:54:06 [SEVERE] Error occurred while enabling Halloween v1.0 (Is it up to date
?): null
Traceback (most recent call last):
File "<iostream>", line 70, in onEnable
NameError: global name '__file__' is not defined

谢谢回答!:)

4

4 回答 4

1

Python Shell 不会检测__file__. 如果你放入__file__一个 python 文件test.py并运行test.py,那么它将运行良好。

于 2015-03-03T12:48:18.207 回答
1

因为我需要创建一个包含配置的新文件夹,在 py 文件所在的同一个文件夹中

简单的答案是,这不是“UNIX 方式”。也不是 Mac OS 的方式。

“UNIX 方式”是将您的配置文件与所有其他配置文件放在“etc”目录中,例如 /etc 或 /usr/local/etc,并在那里查找它们。注意:“包管理器”应该能够在系统管理员需要的地方安装应用程序,你的代码必须足够聪明才能在任何地方找到它。这可能会有很大差异,尤其是在 Linux 发行版中。

“Mac OS 方式”是将配置文件放在“App Bundle”中,这是一个包含程序的目录结构、应用程序的图标图像以及程序所需的任何其他配置文件、消息目录等。用户可修改的配置文件,如果有的话,进入 ~/Library/Application Support/{your program name here}。您可以通过启动终端应用程序在 Mac 上查看其中的一些内容,然后

$ cd /Application/Preview.app

这是 PDF 和图片查看器 Preview 的“应用程序包”。这里有一堆子目录:

$ find . -type d | wc -l
     107

去四处看看。您会发现许多 .plist 文件,它们是属性列表,通常是应用程序各个部分的 XML 配置文件。

长答案是停止尝试强制您的应用程序遵循常见的 Windows 用法,如果您希望它真正“兼容每个操作系统”。

于 2013-10-30T00:07:25.233 回答
0

Because I need to make new folder which will contain config, inside same foldere where is py-file located

因为 config 是系统特定的部分(/etc对于 unix,对于 win 来说是注册表),所以这是使用其他工具的好方法。它可能是安装场景或为首次运行创建配置。如果您使用 jython,请使用Preferences进行设置。这种方式需要,因为最终用户可能没有创建目录的权限,或者您将来可能会遇到支持配置问题。根据您的问题,它在 python2.7 和 jython2.5.3 上对我有用:

#!/usr/bin/python

import sys, os
print sys.argv[0]
print os.path.realpath(__file__)

结果:

$ jython test.py
/home/miha/tmp/11/test.py
/home/miha/tmp/11/test.py

可能你__file__的代码的其他部分超载了吗?

于 2013-10-28T14:55:57.543 回答
-1

Afaik 没有真正可靠的方法来获取带有路径的二进制名称。即使在 Windows 上,通常在从 VPN 等非典型网络共享运行时,这也可能会在某些情况下归档。

在 Linux 上,可以在 /proc/self/exe 中查找,在较新的 freebsd(6+?)上,可以查找带有 KERN_PROC_PATHNAME 的 sysctl。Afaik 在 OS X 上没有办法。如果失败,它只显示文件名,没有 PATH。

我不喜欢 Python,所以我无法提供示例。

于 2013-10-28T14:15:47.897 回答