将脚本的工作文件夹添加到Windows上的Python导入()路径的最佳方法?

时间:2012-02-10 11:06:51

标签: python windows cross-platform working-directory

我有一个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>

我应该以不同的方式解决这个问题,还是我的做法好吗?

4 个答案:

答案 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中添加模块的父目录。