python - 已编译的调用配置文件
python - compiled calling config file
我正在使用 pyinstaller 编译 python 应用程序。
结构是这样的 -
d:\app\myprog.exe
d:\app\config\settings.conf
如果我从 d:\app
运行 myprog.exe --switch value
运行 没问题,如果我尝试从 c:\windows
等其他任何地方 运行它找不到我的 settings.conf
文件,抱怨消息:
Traceback (most recent call last):
File "<string>", line 284, in <module>
File "<string>", line 218, in main
File "ConfigParser.py", line 330, in get
ConfigParser.NoSectionError: No section: 'database'
myApp returned -1
database
是我要引用的配置文件中的第一行。
我在此处引用应用程序中的 BASE_DIR
-
# Global Path and Config Info
try:
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
except NameError: # We are the main py2exe script, not a module
BASE_DIR = os.path.dirname(os.path.abspath(sys.argv[0]))
这样我就可以得到这样的配置文件 -
config = RawConfigParser()
config.read(os.path.join(BASE_DIR, 'config/settings.conf'))
但我猜 BASE_DIR
是我从中 运行 安装 EXE 的任何文件夹(如 c:\windows
,而不是 EXE 的位置(d:\app
)?
如 PyInstaller documentation 中所述(在 单文件程序的工作原理 部分)执行单个可执行文件(由 PyInstaller 创建)时,会发生什么是将所需库模块(Python VM、库和包等)的目录结构从单个可执行文件中提取到一个临时目录,然后从那里启动应用程序。
这意味着 Python 代码中的 __file__
不会成为单个可执行文件的路径,这就是出现此问题的原因。
我会编写我的应用程序以接受来自命令行参数的配置文件路径,回退到使用环境变量(如果可用),然后是基于平台的硬编码默认值(作为大多数多平台应用程序确实需要达到它们的配置)。
另一种方法是使用 PyInstaller 的单目录输出并将配置文件包含在同一目录中。
然后,为了帮助更轻松地向最终用户分发软件,使用另一个工具从该目录结构创建单个 Windows 安装程序文件。这样您将分发 Windows 安装程序,因此用户可以 运行 安装该应用程序。但是应用程序运行时,它会从配置文件所在的目录运行。
我正在使用 pyinstaller 编译 python 应用程序。
结构是这样的 -
d:\app\myprog.exe
d:\app\config\settings.conf
如果我从 d:\app
运行 myprog.exe --switch value
运行 没问题,如果我尝试从 c:\windows
等其他任何地方 运行它找不到我的 settings.conf
文件,抱怨消息:
Traceback (most recent call last):
File "<string>", line 284, in <module>
File "<string>", line 218, in main
File "ConfigParser.py", line 330, in get
ConfigParser.NoSectionError: No section: 'database'
myApp returned -1
database
是我要引用的配置文件中的第一行。
我在此处引用应用程序中的 BASE_DIR
-
# Global Path and Config Info
try:
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
except NameError: # We are the main py2exe script, not a module
BASE_DIR = os.path.dirname(os.path.abspath(sys.argv[0]))
这样我就可以得到这样的配置文件 -
config = RawConfigParser()
config.read(os.path.join(BASE_DIR, 'config/settings.conf'))
但我猜 BASE_DIR
是我从中 运行 安装 EXE 的任何文件夹(如 c:\windows
,而不是 EXE 的位置(d:\app
)?
如 PyInstaller documentation 中所述(在 单文件程序的工作原理 部分)执行单个可执行文件(由 PyInstaller 创建)时,会发生什么是将所需库模块(Python VM、库和包等)的目录结构从单个可执行文件中提取到一个临时目录,然后从那里启动应用程序。
这意味着 Python 代码中的 __file__
不会成为单个可执行文件的路径,这就是出现此问题的原因。
我会编写我的应用程序以接受来自命令行参数的配置文件路径,回退到使用环境变量(如果可用),然后是基于平台的硬编码默认值(作为大多数多平台应用程序确实需要达到它们的配置)。
另一种方法是使用 PyInstaller 的单目录输出并将配置文件包含在同一目录中。 然后,为了帮助更轻松地向最终用户分发软件,使用另一个工具从该目录结构创建单个 Windows 安装程序文件。这样您将分发 Windows 安装程序,因此用户可以 运行 安装该应用程序。但是应用程序运行时,它会从配置文件所在的目录运行。