直接运行Python文件或使用py2exe打包时的奇怪差异

时间:2014-04-23 21:37:41

标签: python

我构建了一个应用程序,当在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.

1 个答案:

答案 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的怪异性。