Найти - Пользователи
Полная версия: проблема с py2exe.
Начало » Python для новичков » проблема с py2exe.
1
refresh
Добрый день, с py2exe не работал (хотя сложного ничего нет), возникла проблема следующего характера: есть python скрипт который открывает некий конфиг файл (по абсолютному пути), читает его построчно (на каждой итерации цикла выполняется блок if в купе с .find(“”), ищя ключевые слова в конфиге) и на основе конфига делает bat сценарий. проблема в том что если выполнять через интерпретатор, то все хорошо. А если скомпилировать py2exe то он ни находить ни одной подстроки .find(“”). пробовал как с помощью python2.7_x64 + py2exe_x64+windows7_x64 так и на python2.7_x32+py2exe_32+windowsXP_x32.

При выполнение через интерпретатор выводит в консоль число строк+“сигнализатор” выполненого условия на каждое условие, а после компиляции выводит только кол-во строк и все они “none”.Вот сам код:

# -*- coding: cp1251 -*-
import os
import linecache
conffile = "C:\event\config_monitor.conf"
mainscript = "C:\event\script.bat"
dcdiaglog = "dcdiag.log"
netviewlog = "netview.log"
processlog = "process.csv"
ipconfiglog = "ipconfig.log"
file = open(mainscript, "w")

def part(string):
string = string.strip("\t\n")
string = string.strip(" ")
tmp_result=string.partition("=")
return tmp_result[2]
def dcdiag(string):

if string == "1,1":
file.write("dcdiag \\q >> "+dcdiaglog+"\nxcode -w "+dcdiaglog+" "+dcdiaglog+"\n")

elif string == "1,0":
file.write("dcdiag >> "+dcdiag.log+"\nxcode -w "+dcdiaglog+" "+dcdiaglog+"\n")

def event(string):
tmp = string.partition(";")
if tmp[0] =="sys,app" or "app,sys":
file.write("psloglist app,sys -f " +tmp[2] + "\n")
else:
file.write("psloglist " + tmp [0] + " -f " + tmp[2] + "\n")
def netview(string):
if string == "1":
file.write("net view >>"+netviewlog+"\nxcode -w "+netviewlog+" "+netviewlog+"\n")
def processlist(string):
if string == "1":
file.write("tasklist /v /FO CSV "+processlog+"\nxcode -w"+processlog+" "+processlog+"\n")
def ipconfig(string):
if string == "1,1":
file.write("ipconfig \\all >> "+ipconfiglog+"\nxcode -w "+ipconfiglog+" "+ipconfiglog+"\n")

elif string == "1,0":
file.write("ipconfig \\all >> "+ipconfiglog+"\nxcode -w "+ipconfiglog+" "+ipconfiglog+"\n")



linerange = sum(1 for l in open(conffile, 'r'))
print linerange
i=1
while i<linerange+1:
line = linecache.getline(conffile, i)
if line.find("dcdiag")!=-1:
print "dcdiag"
dcdiag(part(line))
elif line.find("eventlog")!=-1:
print "event"
event(part(line))
elif line.find("net_view")!=-1:
print "net_view"
netview(part(line))
elif line.find("processlist")!=-1:
print "processlist"
processlist(part(line))
elif line.find("ipconfig")!=-1:
print "ipconfig"
ipconfig(part(line))
else:
print "none" + str(i)
i+=1
конфиг файл вида :

processlist=1
eventlog=app,sys;we
net_view=1
dcdiag=1,1
ipconfig=1,1
Зарание благодарю.
refresh
Проблема решилась с помощью cx_Freeze, все норм, видимо это баг py2exe. Тогда можно другой вопрос, только прошу ответить тех кто реально НА ПРАКТИКЕ, а не в теории сталкивался - что лучше (py2exe или cx_Freeze) и почему?
igor.kaist
refresh
Тогда можно другой вопрос, только прошу ответить тех кто реально НА ПРАКТИКЕ, а не в теории сталкивался - что лучше (py2exe или cx_Freeze) и почему?
Юзал py2exe по историческим причинам. Все всегда устраивало, распространял так несколько относительно популярных программ.
pyuser
Откровенно говоря, я вообще удивлен, что у Вас что-то работало. Взять те же пути к файлам:
# вот эта строка, например
conffile = "C:\event\config_monitor.conf"
# должна выглядеть так
conffile = "C:\\event\\config_monitor.conf"
# или так
conffile = r"C:\event\config_monitor.conf"
ну и общие замечания:
1. как показывает опыт боевых действий, файлы в windows лучше открывать в бинарном режиме
2. strip без параметров отсекает все пробельные символы, поэтому нет смысла вызывать ее несколько раз
3. split, ИМХО, в Вашем случае, более уместен чем partition
4. не вижу смысла использования в Вашем случае linecache, почему не
with open(conffile, "rb") as f:
for line in f:
k, v = line.strip().split("=")
if "dcdiag" == k:
print("dcdiag")
dcdiag(v)
elif ...
5. cx_Freeze кроссплатформенный + работает с третьим питоном, py2exe, лично для меня удобнее тем, что позволяет упаковать все в один exe-файл
refresh
Огромное спасибо pyuser.
Тот код который я выложил это абсолютный набросок, так сказать прототип, сейчас задача как можно быстрее получить результат. Переделывать потом буду. к тому же познакомился с pywin32, что сыграло решающую роль..буду переписывать все заново. Насчет моих скилов питоне…я его изучаю примерно чуть больше недели =)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB