我是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
感谢您的回答! :)
答案 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倾向,所以我不能提供示例。