2014-02-18 54 views
0

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

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") 

此外原始输入语句不保持屏幕打开,所以我不能真正看到发生了什么。

感谢

+0

你真的不应该尝试从'py_exe''可执行文件中的'__file__'访问东西。有没有理由不使用['data_files'](http://www.py2exe.org/index.cgi/data_files),更好的方法是使用'setuptools'及其'pkgresources'? – abarnert

+0

作为一个便笺,调用路径名上的'str.split'是一个坏主意。您已经为所有其他路径操作使用'os.path';调用'dirname(dirname(current_dir))'或类似命令有什么问题? – abarnert

+0

我不使用你建议的东西的原因是我是一个python n00b。 :-) 我在其他线程中发现'_file_'可能是问题。我会为py2exe安装脚本使用data_files,对吧? – mattrweaver

回答

1

尝试访问的数据文件为相对路径断dirname(__file__)是一个非常糟糕的主意,除非你只想运行构建树的程序。如果您想要安装并运行程序(无论是使用py2exe还是其他机制),那么您只是在寻求麻烦。

如果你想与可执行文件打包,这样做的正确方法是无论是从py2exedata_files机制,或者,如果你可以安装和使用setuptools,更强大和灵活的Package Resources机制。

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

但是,如果你真的想这样做......问题是__file__是你的主脚本的文件名 - 当你运行一个捆绑的可执行文件时这当然是没有用的。根据您的使用情况,您可以使用sys.argv[0]sys.executable

+0

我想设置一个文件将被存放的目录。根据我现在如何设置脚本,可执行文件位于该目录内的子目录中。我希望可执行文件是可移植的,这样如果主目录被移动,csv文件和可执行文件之间的关系就会被保留,而不管它放在哪里。 – mattrweaver

+1

好的,如果最终用户存放文件,'data_files'是错误的答案。让用户把文件放到你的应用程序目录几乎总是一个糟糕的设计,但如果这就是你想要的,最后一段如果你的答案。 (为什么不让他们把文件或者一个包含文件的目录作为命令行参数传递,或者将它们拖放到你的exe文件中,而不是将它们复制到你的目录然后运行应用程序?不知道它是如何使用的,我不能肯定这是一个更好的设计,但这是_most_应用程序的工作方式,并非无缘无故。) – abarnert

+0

此人将从基于Web的界面下载文件并将每个csv文件保存到预设目录中。我希望将脚本作为计划任务运行,或者至少让员工双击桌面快捷方式。简而言之,我试图为一个技术不熟练的人自动化一个流程。我想要在'projectfolder'文件中包含应用程序的子目录 - “projectfolder/appdirectory”文件不会进入应用程序目录本身 – mattrweaver

相关问题