直接运行Python文件或使用py2ex打包时的奇怪区别

2024-06-13 19:40:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我构建了一个应用程序,在Windows上运行时,它应该为不同类型的文件使用%USERPROFILE%\AppData\Roaming%USERPROFILE%\Documents目录——否则,在Linux上,它应该只使用$HOME目录。你知道吗

问题:我的代码对shell.SHGetFolderPath()函数的处理方式不同,这取决于我是直接运行.py文件还是通过py2exe打包。你知道吗

我使用这个函数作为程序“知道”它是否在Windows上的一种方式。直接运行.py文件时,一切都按预期进行。当运行通过py2exe打包的.py文件时,生成的.exe文件认为它是非Windows系统,并直接使用%USERPROFILE%目录作为应用程序数据文件和用户文件的$HOME。除了这个差异,程序的其余部分似乎运行正常(每个变量都成功地遵循自己的不同路径)。你知道吗

问题1:是什么导致了这种差异?你知道吗

问题2:有没有更好的方法来检测Windows/non-Windows环境?我想我在StackOverflow的某个地方读到了我正在使用的方法,但记不清/找不到确切的位置。你知道吗

代码是这样的(它的开头,足以实际生成目录),接下来是我用于py2exe构建的代码。你知道吗

我在soup中使用的系统是64位的windowsvista,python2.7.6和py2exe0.6.9,都是32位的(还有wxpython2.8.12,32位,unicode,如果这在这里很重要的话)。你知道吗

编辑:我尝试了dabhaid的解决方案,因此我找到了导致代码差异的原因,但不是py2exe产生差异的原因。我的意思是——在.exe变体中,程序现在以“ImportError:No module named shell”停止,所以现在很清楚为什么程序跳过了原始的try:语句。你知道吗

所以现在是第三个问题:

问题3:对于错误“ImportError:没有名为shell的模块”,我应该怎么做?如果直接从命令行运行.py程序,则不会发生这种情况。你知道吗

edit2:我想我在py2exe.org找到了Q3的答案,稍后将尝试理解这里解释的可能修复方法。你知道吗

编辑3:在py2给出的解exe.org工作了,所有问题都解决了。你知道吗

#!/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.

以及

from distutils.core import setup
import py2exe
import sys, os

sys.argv.append('py2exe')
setup(
    options = {'py2exe': {
        'dll_excludes': ['w9xpopen.exe'],
        'dist_dir': 'dist',
        }
    },
    name = "test",
    windows = [
        {
            'script': "test.py",
        },
    ],
    zipfile = None,
    description = "test file",
)

Tags: 文件pathpyimport程序ifoswindows
1条回答
网友
1楼 · 发布于 2024-06-13 19:40:07

对于第二个问题,使用

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的怪异性。你知道吗

相关问题 更多 >