【发布时间】:2015-08-05 10:09:24
【问题描述】:
我使用py2exe 模块创建了一个exe 文件。奇怪的是,当我从命令行运行exe 时它必须工作,但是当我双击这个exe 时,它会打开一个控制台(因为它必须这样做)并且控制台会立即关闭.
我写了一个logging 方法来找出问题所在,并用try-except 包围了该方法,它没有捕获任何异常。
这是我的一段代码:
if __name__ == '__main__':
try:
mh = moto()
db = database() # you can find __init__ of database() below
log('ok') # I CAN'T FIND THIS LINE IN THE LOG FILE SO THE PROBLEM IS PROBABLY INSIDE __INIT__ OD database()
except Exception as e:
log(str(e))
log(str(traceback.format_exc))
for url in [__CATs__,__hyphens__]:
log(' for url')
初始化数据库():
class database():
def __init__(self):
self.conn = sqlite3.connect('db.db') # Database is created
self.cursor = self.conn.cursor()
self.create_table_moto()
self.drop_and_create_temp_table()
log('init_end') # I CAN FIND THIS LINE IN LOG FILE SO THE PROBLEM SHOULD BE AFTER database() initialization but i doubt that because of the log right after database()
所以主要的奇怪之处在于 database() 的 __init__ 方法可能工作正常,因为我可以在我的日志文件中看到最后一行 log('init_end')。但是在这个初始化之后是另一个日志log('ok'),我没有在日志文件中看到它,也没有捕获到异常。
非常重要的编辑:
当您使用 py2exe 创建 exe 文件时,它会在您的项目存储的文件夹中创建一个文件夹 dist。只有当我在这个父文件夹中时,才能使用 cmd 启动 exe 文件,所以我必须写 dist\moto.exe。 moto.exe 或 project\dist\moto.exe 不起作用。
编辑:
另一个奇怪的事情:
我在log('ok') 之后添加了行:mLib.printToFile('testovaci_txt.txt', 'nieco'),这不起作用,它会在存储“exe”和其他文件的文件夹中创建文件testovaci_txt.txt。
EDIT2:log 方法位于site-packages 内的我的外部库中。要弄清楚log('ok') 将我创建的文件“log_2('ok')”保存在哪里,它会创建一个文件logging-testing.txt 并将其放在log('ok') 之后并启动程序。然后我在windows中搜索了这个文件,找不到。
你知道问题出在哪里吗?
【问题讨论】:
-
设置路径或使用带文件名的完整路径。默认情况下,双击在
%windir%\system32中运行(可能不是您的文件所在的位置) -
@Stephan 奇怪的是我经常使用这种方法并且一切正常。我不能使用完整路径,因为我要向我的朋友发送一个 exe。那么我该如何设置我的路径呢?谢谢
-
正如@Stephan 所说,它可能与路径有关。看起来
class database登录的路径与您的__main__不同。如果没有引发错误,您可能会在意外路径中找到另一个带有“ok”的日志。 -
我很确定这是 Windows 中的默认行为。如果您想在控制台关闭之前查看程序的输出,请在程序末尾添加一个 raw_input() 读取,以便它与您的输出一起暂停。
-
记录
os.getcwd(),并比较从命令提示符运行和双击运行时的情况。