全局名称__file__未定义?

时间:2013-10-28 14:03:58

标签: python jython

我是bukkit插件编码器,我一直在制作配置文件。我想使用__file__找到.py文件的当前目录...我在Google上搜索并看到了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 个答案:

答案 0 :(得分:1)

  

因为我需要创建一个包含config的新文件夹,所以在py-file所在的同一个文件夹中

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

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

“Mac OS方式”是将配置文件放在“App Bundle”中,该目录结构包含您的程序,应用程序的图标图像以及任何其他配置文件,消息目录等,程序。用户可修改的配置文件(如果有的话)进入〜/ Library / Application Support / {您的程序名称}。您可以通过启动终端应用程序和

在Mac上查看其中的一些内容
$ cd /Application/Preview.app

这是预览的“应用程序包”,即PDF和图片查看器。这里有很多子目录:

$ find . -type d | wc -l
     107

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

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

答案 1 :(得分:1)

Python Shell不会检测__file__中的当前文件路径。 如果您将__file__放在python文件test.py和运行test.py中,那么它将运行良好。

答案 2 :(得分:0)

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

因为config是系统特定的部分(unix的/etc,win的注册表),所以使用其他工具是很好的方法。它可能是安装场景或首次运行创建配置。如果您使用jython使用Preferences进行设置。这种方式需要,因为enduser可能没有create directory的权限,或者您将来可能遇到support config的问题。 根据你的问题,它适用于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__吗?

答案 3 :(得分:-1)

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

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

我不是Python倾向,所以我不能提供示例。