2012-02-10 25 views
5

我有一个python程序,我使用py2exe编译到Windows .exe。 使用Inno Setup,我创建了一个Windows安装程序。将脚本的工作文件夹添加到Windows的Python导入()路径的最佳方法是什么?

我的程序的性质是这样的,它使用使用__import__()声明以后导入插件。这些插件位于'plugins'文件夹中,该文件夹本身位于我的程序的.exe文件所在位置的子文件夹中。

现在,有程序找到的插件,它早些时候曾somwhere下面的语句在我的文件的开头:

sys.path+= ['.'] 

然而,这都不尽如人意,当用户通过Windows启动程序'开始菜单,因为显然工作文件夹被设置为开始菜单(而不是.exe所在的位置)。所以'.'没有解决我想要的。

我固定它通过改变语句下面,让__import__()声明还看起来在.exe文件所在的文件夹中(因为argv[0]是可执行文件的完整路径):

sys.path+= [os.path.dirname(sys.argv[0])] 

但是,我不确定我是否选择了正确的解决方案。尤其是,因为我的程序是为了跨平台(Windows,OSX,Linux)和sys.argv documentation对argv [0]的说法,“它是否取决于操作系统是否是全路径”。

我应该不同解决这个问题,或者是我的方法好不好?

回答

0

请使用模块的__file__。你可以这样写

sys.path+=os.path.dirname(mymodule.__file__)

这将在sys.path中添加模块的父目录。

+3

嗯,我不相信,因为'__file__'返回我的Windows。exe程序:'C:\ Program Files(x86)\ myprogram \ myprogram.exe \ core.pyc'。这将需要我去掉两层返回的路径('core.pyc'和'myprogram.exe'),这可能不是OSX,Linux或甚至从终端运行时的情况。 – Rabarberski 2012-02-10 11:27:26

+1

然后最好的解决方案是配置文件由@SpencerRathbun提到 – Nilesh 2012-02-14 06:34:56

1

我经常使用这样的:

os.chdir(sys.argv[0].rsplit(os.sep, 1)[0]) 

,使得运行与开发的环境,在那里你运行你的脚本由它的目录一致。

+0

有道理。为什么不使用'os.path.dirname(sys.argv [0])'而不是'rsplit'方法? “dirname”方法似乎更加自我记录,也许会捕获一些特殊的(跨平台的)案例。 – Rabarberski 2012-02-10 13:15:53

3

在我的编译.EXE的Qt programms的,我使用的代码非常相似,你的:

def executable_path(): 
    self_file = unicode(sys.argv[0], sys.getfilesystemencoding()) 
    return os.path.realpath(os.path.dirname(self_file)) 

我使用Unicode,因为路径可能包含非ASCII符号。

sys.argv中取决于这是否是一个完整路径名与否

os.path.realpath [0]是操作系统,解决了问题。

3

为什么没有config文件与路径的插件目录?这可以让用户移动它,每个操作系统都可以有一个。将它与可执行文件,或者几个使用良好的位置,linux上的〜或/ etc以及windows上的%homepath%进行比较。

+0

是的,我正在计划这样的未来功能。但在此期间,我希望拥有一个更简单的解决方案,让单个位置(相对于可执行文件)正常工作。感谢您的建议! – Rabarberski 2012-02-10 14:42:03

+1

没错。 windows下的插件可能最终会以%APPDATA%结尾...... – 2012-02-10 14:43:04

+1

@Rabarberski如果这是一个简单的解决方案,那么如何让插件与exe文件位于同一文件夹中? – 2012-02-10 14:44:51

相关问题