我构建了一个应用程序,当在Windows上运行时,应该将%USERPROFILE%\AppData\Roaming
和%USERPROFILE%\Documents
目录用于不同类型的文件 - 否则,在Linux上,它应该只使用{{1目录。
问题:我的代码区别对待$HOME
函数,具体取决于我是直接运行.py文件还是通过py2exe打包。
我正在使用此功能作为程序的一种方式来了解'如果它在Windows上(或不在)。直接运行.py文件时,一切都按预期进行。当运行通过py2exe打包的.py文件时,生成的.exe文件认为它是非Windows系统,并直接使用shell.SHGetFolderPath()
目录作为%USERPROFILE%
用于应用程序数据文件和用户文件。除了这个差异,程序的其余部分似乎运行正常(每个变体成功地遵循自己的不同路径)。
Q1:可能导致这种差异的原因是什么?
Q2:有没有更好的方法来检测Windows /非Windows环境?我想我在StackOverflow上读到了我在某处使用的方法,但是无法记住/找到确切的位置。
代码是这个(它的开头,足以实际生成目录),接下来是我用于py2exe构建的代码。
我用于汤的系统是Windows Vista 64位,Python 2.7.6和py2exe 0.6.9,32位(以及wxPython 2.8.12,32位,unicode,如果这里重要的话)。
编辑我尝试了dabhaid的解决方案,因此我找到了导致我的代码差异的原因,但没有找到py2exe产生差异的原因。我的意思是 - 在.exe变体中,程序现在以" ImportError:没有名为shell"的模块停止,所以现在它清楚了为什么程序跳过原始的$HOME
语句。 / p>
现在提出第三个问题:
问题3:我该如何处理错误" ImportError:没有名为shell的模块" ?如果直接从命令行运行.py程序,则不会发生这种情况。
edit2:我想我在py2exe.org找到了Q3的答案,稍后会尝试了解那里解释的可能解决方法。
edit3: py2exe.org提供的解决方案有效,所有问题都解决了问题。
try:
和
#!/usr/bin/env python
appname = "aa app name"
apppath = "pp path name"
import os
import re
# define OS specific paths
# create application directories if not already existing
# edit -- code changed
# was: try:
# next line is new:
if os.name == 'nt':
""" if windows """
# edit -- in py2exe packed variant only, the next line gives "ImportError: No module named shell"
from win32com.shell import shellcon, shell
homedir_appdata = shell.SHGetFolderPath(0, shellcon.CSIDL_APPDATA, 0, 0)
homedir_documents = shell.SHGetFolderPath(0, shellcon.CSIDL_PERSONAL, 0, 0)
# edit -- code changed
# was: except ImportError:
# next line is new:
else:
""" if non-windows """
homedir = os.path.expanduser("~")
homedir_appdata = homedir
homedir_documents = homedir
apppath = "." + apppath.lower()
appdata_path = os.path.join(homedir_appdata, apppath)
documents_path = os.path.join(homedir_documents, apppath)
match = re.search(r'\.', apppath)
if not match:
""" if windows """
try:
os.makedirs(appdata_path)
except OSError:
if not os.path.isdir(appdata_path):
raise
try:
os.makedirs(documents_path)
except OSError:
if not os.path.isdir(documents_path):
raise
# define specific file paths and file names
config_filename = appname + ".ini"
config_filename_wpath = os.path.join(appdata_path, config_filename)
user_filename = appname + ".csv"
user_filename_wpath = os.path.join(documents_path, user_filename)
# etc.
答案 0 :(得分:1)
关于第二个问题,请使用
import os
if os.name == 'nt':
#do Windows stuff here
elif os.name == 'posix':
#do Linux stuff here - note OS X shows up as 'posix'
对于你的第一个问题,py2exe可以做一些奇怪的事情,我以前遇到过py2app的问题,但我没有一个Windows框可以用来检查shell的怪异性。