我有一个python程序,我使用py2exe编译成Windows .exe。 使用Inno Setup,我创建了一个Windows安装程序。
我的程序的性质是它使用后来使用__import__()
语句导入的插件。这些插件位于“plugins”文件夹中,该文件夹本身位于程序的.exe文件所在的子文件夹中。
现在,要让程序找到插件,它早先在我的文件顶部有以下语句:
sys.path+= ['.']
然而,当用户通过Windows的开始菜单启动程序时,这不能很好地工作,因为显然工作文件夹设置为开始菜单(而不是.exe所在的位置)。所以'.'
没有解决我想要的问题。
我通过将语句更改为以下内容来修复它,以便__import__()
语句也查找.exe所在的文件夹(因为argv[0]
是可执行文件的完整路径):
sys.path+= [os.path.dirname(sys.argv[0])]
但是,我不确定我是否选择了正确的解决方案。特别是,因为我的程序是跨平台的(Windows,OSX,Linux)和sys.argv documentation关于argv [0]的说法,“它是依赖于操作系统的,无论这是否是一个完整的路径名”。 / p>
我应该以不同的方式解决这个问题,还是我的做法好吗?
答案 0 :(得分:3)
在我编译的.exe Qt程序中,我使用的代码与你的代码非常相似:
def executable_path():
self_file = unicode(sys.argv[0], sys.getfilesystemencoding())
return os.path.realpath(os.path.dirname(self_file))
我正在使用unicode,因为路径可能包含非ascii符号。
sys.argv [0]依赖于操作系统,无论这是否是完整路径名
os.path.realpath
解决了这个问题。
答案 1 :(得分:3)
为什么没有带有插件目录路径的config文件?这允许用户移动它,并且每个操作系统可以有一个。坚持使用可执行文件,或者在Linux上使用几个好用的位置,〜或/ etc,在windows上使用%homepath%。
答案 2 :(得分:1)
我经常使用这个:
os.chdir(sys.argv[0].rsplit(os.sep, 1)[0])
使运行时与开发环境保持一致,您可以从该目录运行脚本。
答案 3 :(得分:0)
请使用模块的__file__
。你可以这样写
sys.path+=os.path.dirname(mymodule.__file__)
这将在sys.path中添加模块的父目录。