5

我有一个 python 程序,我使用 py2exe 将其编译为 Windows .exe。使用Inno Setup,我创建了一个 Windows 安装程序。

我的程序的性质是它使用插件,这些插件后来使用__import__()语句导入。这些插件位于“插件”文件夹中,该文件夹本身位于我的程序的 .exe 文件所在的子文件夹中。

现在,为了让程序找到插件,它早些时候在我的文件顶部有以下语句:

sys.path+= ['.']

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

我通过将语句更改为以下内容来修复它,以便该__import__()语句也可以在 .exe 所在的文件夹中查找(因为argv[0]是可执行文件的完整路径):

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

但是,我不确定我是否选择了正确的解决方案。特别是,因为我的程序是跨平台的(Windows、OSX、Linux),并且sys.argv 文档说 argv[0] 说“它是否取决于操作系统,这是否是一个完整的路径名”。

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

4

4 回答 4

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解决了这个问题。

于 2012-02-10T14:13:46.420 回答
3

为什么没有带有插件目录路径的配置文件?这使用户可以移动它,并且您可以为每个操作系统拥有一个。将其与可执行文件或几个使用良好的位置,Linux 上的 ~ 或 /etc 以及 Windows 上的 %homepath% 一起粘贴。

于 2012-02-10T14:37:57.443 回答
1

我经常使用这个:

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

这使得运行时与开发环境一致,您可以在其中从其目录运行脚本。

于 2012-02-10T12:47:41.610 回答
0

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

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

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

于 2012-02-10T11:17:52.550 回答