【问题标题】:python code works but not in p2exe executablepython代码有效,但不适用于p2exe可执行文件
【发布时间】:2014-03-17 13:34:04
【问题描述】:

以下代码可自行运行。我用 py2exe 创建了一个无法运行的可执行文件。该脚本处理和排序一些 csv 文件。如果我将此代码放在运行可执行文件的“dist”目录中(因此它与正在处理的 csv 文件具有相同的文件路径深度),则代码有效;但是同一目录中的可执行文件本身不起作用。

import glob
import os
import pandas as pd

current_dir = os.path.dirname(os.path.realpath(__file__))

directory = os.path.sep.join(current_dir.split(os.path.sep)[:-2])
csvfiles = os.path.join(directory, '*.csv')
for csvfile in glob.glob(csvfiles):
    filename = os.path.basename(csvfile)
    if '_sorted' in filename:
        print "Remove this file"
        os.remove(csvfile)

csvfiles = os.path.join(directory, '*.csv')
for csvfile in glob.glob(csvfiles):
    filename = csvfile
    df = pd.read_csv(filename)

    df = df[df["ORGANIZATION"]!="WPPL"]
    df = df.sort('MEETING START TIME')    
    #write new csv file
    df.to_csv(filename + '_sorted.csv', cols=["DATE","MEETING START TIME","MEETING END TIME","DESCRIPTION","ORGANIZATION","LOCATION"],index=False)

raw_input("Press enter to close")

原始输入语句也没有保持屏幕打开,所以我看不到发生了什么。

谢谢

【问题讨论】:

  • 你真的不应该尝试在py2exe 可执行文件中访问__file__ 之外的东西。您是否有理由不使用data_files,或者更好的是setuptools 及其pkgresources
  • 附带说明,在路径名上调用str.split 是个坏主意。您已经在使用os.path 进行所有其他路径操作;打电话给dirname(dirname(current_dir)) 或类似的有什么问题?
  • 我不使用你建议的东西的原因是我是一个 python n00b。 :-) 我在其他线程中发现 _file_ 可能是问题所在。我会为 py2exe 设置脚本使用 data_files,对吧?

标签: python path executable py2exe


【解决方案1】:

除非您只想在构建树中运行程序,否则尝试将数据文件作为dirname(__file__) 之外的相对路径访问是一个非常糟糕的主意。如果您希望能够安装和运行该程序(无论是使用 py2exe 还是任何其他机制),您只是在自找麻烦。

如果您尝试使用可执行文件打包文件,正确的做法是使用来自py2exedata_files 机制,或者,如果您可以安装和使用setuptools,则更强大且灵活的Package Resources 机制。

另一方面,如果您希望用户在安装您的应用后提供 CSV 文件,您几乎肯定不想让他将这些文件放入您的应用目录。通常要做的是将它们作为当前工作目录的相对路径访问。换句话说,只使用.,而不是dirname(__file__)

但是,如果你真的想这样做……问题是__file__ 是你的主脚本的文件名——当你运行一个捆绑的可执行文件时这当然没有用。您可以使用sys.argv[0]sys.executable,具体取决于您的用例。

【讨论】:

  • 我想设置一个存放文件的目录。根据我现在如何设置脚本,可执行文件位于该目录的子目录中。我希望可执行文件是可移植的,这样如果主目录被移动,无论放在哪里,csv文件和可执行文件之间的关系都会保持不变。
  • 好的,如果最终用户正在存放文件,data_files 是错误的答案。让用户将文件放入您的应用程序目录几乎总是一个糟糕的设计,但如果这是您想要的,那么最后一段就是您的答案。 (为什么不让他们将文件或充满文件的目录作为命令行参数传递,或者将它们拖放到您的 exe 中,而不是将它们复制到您的目录然后运行应用程序?不知道它是如何使用的,我不能肯定这是一个更好的设计,但这是大多数应用程序的工作方式,这不是没有原因的。)
  • 此人将从基于 Web 的界面下载文件并将每个 csv 文件保存到预设目录中。我希望将脚本作为计划任务运行,或者至少让员工双击桌面快捷方式。简而言之,我正在尝试为技术上不太熟练的人自动化流程。我想拥有projectfolder 中的文件,其中还包含应用程序的子目录-projectfolder/appdirectory 文件不会进入应用程序目录本身
  • 谢谢,@abarnert。 sys,argv[0] 做到了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-22
  • 2020-11-27
  • 1970-01-01
  • 2017-03-09
  • 1970-01-01
  • 2016-03-16
  • 1970-01-01
相关资源
最近更新 更多