Script läuft nur auf meinem Rechner, obwohl gleiche Install

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
patmaster
User
Beiträge: 106
Registriert: Donnerstag 3. Februar 2011, 17:21

Hi,

Ich habe die folgenden Scripte geschrieben und sie laufen bei mir auch wunderbar.
Nachdem ich nicht auf jedem Rechner Python + alles Libs installen will, habe ich einfach meine Installation auf ein Netzlaufwerk kopiert und rufe sie in einem .bat über die pythonw.exe dort auf. Das Problem ist nun das sich auf allen anderen Rechnern (ausser auf dem Entwicklungsrechner) einfach nix tut. Kein Fehler, aber auch keine Anwendung.

Hat jemand eine Idee dazu ?

Danke schon mal !

PS(Ich bin noch recht gründ hinter den Ohren also bitte nicht gleich ausfallend werden wenn ich nicht alles Konventionen einhalte ^^...darauf hingewiesen werde ich aber natürich gerne.)

Code: Alles auswählen

# -*- coding: utf-8 -*-
import wx, os, win32com.client as win32, traceback, word_test, time
from lxml import etree
from threading import Thread
from wx.lib.pubsub import setupv1 as psv1
from wx.lib.pubsub import Publisher 
import pythoncom

class MainWindow(wx.Frame):
    def __init__(self, parent, title):
        self.checkson = word_test.CheckOr()
        # A "-1" in the size parameter instructs wxWidgets to use the default size.
        # In this case, we select 200px width and the default height.
        wx.Frame.__init__(self, parent, title=title)
        self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE|wx.HSCROLL)
        self.control.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.FONTWEIGHT_NORMAL))
        self.Statusbar = self.CreateStatusBar() # A Statusbar in the bottom of the window
        self.Statusbar.SetStatusText("LexisNexis | DCM 2012 (c)")
        self.Button1 = wx.Button(self, -1, "Check'em", size=(100,50))
        self.Button2 = wx.Button(self, -1, "Clear", size=(100,50))
        self.ChoiceList = wx.Choice(self,1,choices=self.checkson.getJournals())
        self.Label1 = wx.StaticText(self,1, label="Zeitschrift: ")
        dt = MyFileDropTarget(self.control)
        self.control.SetDropTarget(dt)
        
        Publisher.subscribe(self.updateDisplay, "update")
        
        ib = wx.IconBundle()
        ib.AddIconFromFile("check.ico", wx.BITMAP_TYPE_ANY)
        self.SetIcons(ib)
        
        # Setting up the menu.
        filemenu= wx.Menu()
        #menuOpen = filemenu.Append(wx.ID_OPEN, "&Open"," Open a file to edit")
        menuAbout= filemenu.Append(wx.ID_ABOUT, "&About"," Information about this program")
        menuExit = filemenu.Append(wx.ID_EXIT,"E&xit"," Terminate the program")        
        # Creating the menubar.
        menuBar = wx.MenuBar()
        menuBar.Append(filemenu,"&File") # Adding the "filemenu" to the MenuBar
        self.SetMenuBar(menuBar)  # Adding the MenuBar to the Frame content.
        
        # Events.
        #self.Bind(wx.EVT_MENU, self.OnOpen, menuOpen)
        self.Bind(wx.EVT_MENU, self.OnExit, menuExit)
        self.Bind(wx.EVT_MENU, self.OnAbout, menuAbout)
        self.Bind(wx.EVT_BUTTON, self.OnCheck, self.Button1)
        self.Bind(wx.EVT_BUTTON, self.OnClear, self.Button2)
        # Use some sizers to see layout options
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.control, 1, wx.EXPAND)
        self.sizer2 = wx.BoxSizer(wx.HORIZONTAL)
        self.sizer.Add(self.sizer2, 0, wx.EXPAND)        
        self.sizer2.Add(self.Button1, 1,wx.EXPAND)
        self.sizer2.Add(self.Button2, 1,wx.EXPAND)
        self.sizer3 = wx.BoxSizer(wx.VERTICAL)
        self.sizer2.Add(self.sizer3, 2,wx.EXPAND)
        self.sizer3.Add(self.Label1, 0)
        self.sizer3.Add(self.ChoiceList, 0,wx.EXPAND)     
        
        self.SetBackgroundColour("#FFFFF")   
        
        #Layout sizers
        self.SetSizer(self.sizer)
        self.MinSize = (700,500)
        self.Fit()
        self.Show()

    def OnAbout(self,e):
        # Create a message dialog box
        dlg = wx.MessageDialog(self, "This Tool checks for troubles in Word-documents.\n (c)Patrick Szabo, LexisNexis 2012", "About", wx.OK)
        dlg.ShowModal() # Shows it
        dlg.Destroy() # finally destroy it when finished.                                
        
    def OnExit(self,e):
        self.Close(True)  # Close the frame.
    
    def OnClear(self,e):
        self.control.Clear()
        
    def OnCheck(self, file):
        files = []
        for line in range(0,self.control.GetNumberOfLines()-1):        
            files.append(self.control.GetLineText(line))
        self.control.Clear()
        for i in range(0,len(files)):
            self.control.AppendText(" \n")
        self.control.Clear()
        
        CheckThread(files)
        
        #for file in files:
        #    self.control.AppendText("Working on %s...\n" % file)
        #    for error in self.checkson.main(file):
        #        self.control.AppendText("      Unknown: '%s' at '%s'(%i)\n" % (error[2],error[1],error[0]))
        #        self.control.AppendText("Done...\n")
        #self.control.AppendText("\n")
        #self.control.AppendText("Finished!\n")
    
    def updateDisplay(self, msg):
        """
        Receives data from thread and updates the display
        """
        t = msg.data        
        self.control.AppendText(t)
        
        
class MyFileDropTarget(wx.FileDropTarget):
    def __init__(self, window):
        wx.FileDropTarget.__init__(self)
        self.window = window

    def OnDropFiles(self, x, y, filenames):
        for file in filenames:            
            self.window.AppendText("%s\n" % file)
            
class CheckThread(Thread):
    """Test Worker Thread Class."""
 
    def __init__(self, files):
        """Init Worker Thread Class."""
        Thread.__init__(self)        
        self.checkson = word_test.CheckOr()
        self.files = files
        self.start()    # start the thread
    
    def run(self):
        pythoncom.CoInitializeEx(pythoncom.COINIT_APARTMENTTHREADED)
        """Run Worker Thread."""
        # This is the code executing in the new thread.
        for file in self.files:
            self.postTime("Working on %s...\n" % file)
            for error in self.checkson.main(file):
                self.postTime("  Unknown: '%s' at '%s'(%i)\n" % (error[2],error[1],error[0]))
            self.postTime("Done...\n")
            self.postTime("\n")
        self.postTime("\n")
        self.postTime("Finished!\n")        
        pythoncom.CoUninitialize(pythoncom.COINIT_APARTMENTTHREADED)
 
    def postTime(self, amt):
        Publisher.sendMessage("update", amt)

app = wx.App(False)
frame = MainWindow(None, "ChecktO_ol")
app.MainLoop()

Code: Alles auswählen

# -*- coding: utf-8 -*-
'''
Created on 03.02.2012

@author: szabop
'''
import win32com.client as win32, traceback
from lxml import etree

class CheckOr():        
        def __init__(self):
            self.zeitschrift ="ZFR"
            self.parser = etree.XMLParser(recover=True, resolve_entities=True, load_dtd=True)
            self.formats_file = "formats.xml" 
            self.formats = etree.ElementTree(etree.XML(open(self.formats_file, 'r').read(),self.parser))   
            self.root = self.formats.getroot()
            self.common_formats = [x.lower().strip() for x in self.zeichen(self.root.xpath('common/text()')[0]).split(',')]                
            self.numbered_formats = [x.lower().strip() for x in self.zeichen(self.root.xpath('numbered/text()')[0]).split(',')]                
            self.specific_formats = {}
            for zs in self.root.xpath('zs'):
                self.specific_formats[zs.xpath("zs_name/text()")[0]] = self.zeichen(zs.xpath("zs_formats/text()")[0]).split(',')              
            self.final_formats = self.common_formats + self.specific_formats[self.zeitschrift]
            for i in range(1,20):
                for item in self.numbered_formats:
                    self.final_formats.append(item + " %i" %i)            

        def zeichen(self, s):
            return s.replace(u"ü","ue").replace(u"ä", "ae").replace(u"ß", "ss")
            
        def main(self, file):        
            word = win32.gencache.EnsureDispatch('Word.Application')
            doc = word.Documents.Open(file)
            errors = []
            p = 0
            for par in doc.Paragraphs:
                print 
                if not(self.zeichen(unicode(par.Format.Style)).lower().strip() in self.final_formats):
                    #print "WRONG: %s" % self.zeichen(str(par.Format.Style)).lower()
                    #print "P%i: %s" % (p+1,par)
                    errors.append([p+1,unicode(par).strip(),self.zeichen(unicode(par.Format.Style)).lower()])                    
                p+=1 
            doc.Close()
            word.Application.Quit(-1)
            return errors
        
        def getJournals(self):
            return self.specific_formats.keys()            

#checker = CheckOr()
#checker.main("I:\\_zeitschriften\RdW\\produktion\\06a-Word_ueberarbeitet_aufsatz\\0201_2012_2_zorn_korr.doc")
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

Starte das ganze doch mal über die python.exe anstatt pythonw.exe. Dann bekommst auch eine Ausgabe... Am besten das ganze auch per cmd starten und nicht nur auf die batch klicken.

Den Code habe ich mir übrigens nicht angeschaut :P
patmaster
User
Beiträge: 106
Registriert: Donnerstag 3. Februar 2011, 17:21

Danke für deine Antwort.

Leider verhält es sich mit der python.exe genauso.

Im Cmd-Fenster passiert auch einfach nix. Er tut so als wäre er fertig und zeigt mir wieder pfad> cursor.

Andere Ideen?
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

Hmm komisch...

Nach einer kleinen Google Suche habe ich PortablePython gefunden.
Ich schließe da draus dass man Python nicht einfach auf einen anderen PC verschieben kann... Sonst würde es das Projekt ja nicht geben :D
Ich habe aber keinerlei Erfahrungen damit.
patmaster
User
Beiträge: 106
Registriert: Donnerstag 3. Februar 2011, 17:21

JonasR hat geschrieben:Hmm komisch...

Nach einer kleinen Google Suche habe ich PortablePython gefunden.
Ich schließe da draus dass man Python nicht einfach auf einen anderen PC verschieben kann... Sonst würde es das Projekt ja nicht geben :D
Ich habe aber keinerlei Erfahrungen damit.
Hmm...bisher hat das eigentlich immer wunderbar geklappt. Hab da schon x Scripte auf diese Art und Weise laufen.
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

Alles klar dann bin ich ab jetzt still :P
patmaster
User
Beiträge: 106
Registriert: Donnerstag 3. Februar 2011, 17:21

Ich wäre wirklich sehr dankbar wenn mir hier jemand helfen könnte, ich bin nämlich echt am verzweifeln :K .
Ich wollte das ganze erst sowieso mit py2exe deployen aber das scheint auch verdammt tricky zu sein (google spuckt da genug leute mit den gleichen Problemen aus, leider hilft mir keine der Lösungen).
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Ich behaupte einfach mal, dass einfaches Kopieren einer Installation schlicht und ergreifend nicht ausreicht. Entweder lagerst du alle nötigen Bibliotheken mitsamt dem Programm mittels Py2Exe oder ähnlichem zu einer universell nutzbaren Datei aus oder installierst Python mitsamt allen Bibliotheken auf allen Rechnern. Die Wahl kannst du selbst treffen :wink:
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Ich kann PortablePython auch empfehlen, lässt sich auch gut per USB mitbringen.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
patmaster
User
Beiträge: 106
Registriert: Donnerstag 3. Februar 2011, 17:21

Okay, danke für eure Antworten.
Dann werd ich mich wohl weier mit Py2exe quälen.
Komisch das das mit dem auslagern der Installation bisher so gut geklappt hat, aber was solls.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@patmaster: Laufen beide Skripte nicht? Beim 1. sollte ja zumindest eine GUI erscheinen, beim 2. passiert in der geposteten Form in der Tat nichts, weil du nur die Klasse "CheckOr" definierst, diese aber nicht nutzt bzw. aufrufst.

Ansonsten würde ich auch drauf tippen, was webspider schon gesagt hat: Einfaches Kopieren reicht nicht.

Zu py2exe: Hast du es den schon *probiert* oder hast du dich direkt von den Google-Ergebnissen abschrecken lassen?

Gruß, noisefloor
patmaster
User
Beiträge: 106
Registriert: Donnerstag 3. Februar 2011, 17:21

noisefloor hat geschrieben:Hallo,

@patmaster: Laufen beide Skripte nicht? Beim 1. sollte ja zumindest eine GUI erscheinen, beim 2. passiert in der geposteten Form in der Tat nichts, weil du nur die Klasse "CheckOr" definierst, diese aber nicht nutzt bzw. aufrufst.

Ansonsten würde ich auch drauf tippen, was webspider schon gesagt hat: Einfaches Kopieren reicht nicht.

Zu py2exe: Hast du es den schon *probiert* oder hast du dich direkt von den Google-Ergebnissen abschrecken lassen?

Gruß, noisefloor
Das eine Script importiert das andere und führt auch die main Methode aus ;). Mittlerweile läuft es sogar. Hab in den Install-log nachgesehen und bemerkt das da einige DLLs kopiert werden. Wenn man die dann auf der Zielmaschiene auch hat läuft's auch ^^.

Neues Problem:
File "R:\Produktion\Tools\LexisNexis\at\ChecktO_ol\src\ChecktO_ol.py", line 137, in run
for error in self.checkson.main(file):
File "R:\Produktion\Tools\LexisNexis\at\ChecktO_ol\src\word_test.py", line 31, in main
word = win32.gencache.EnsureDispatch('Word.Application')
File "R:\Produktion\Tools\Python\Python27\lib\site-packages\win32com\client\gencache.py", line 529, in EnsureDispatch
disp = win32com.client.Dispatch(prog_id)
File "R:\Produktion\Tools\Python\Python27\lib\site-packages\win32com\client\__init__.py", line 95, in Dispatch
dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,userName,clsctx)
File "R:\Produktion\Tools\Python\Python27\lib\site-packages\win32com\client\dynamic.py", line 108, in _GetGoodDispatchAndUserName
return (_GetGoodDispatch(IDispatch, clsctx), userName)
File "R:\Produktion\Tools\Python\Python27\lib\site-packages\win32com\client\dynamic.py", line 85, in _GetGoodDispatch
IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.IID_IDispatch)
com_error: (-2147221005, 'Ung\xfcltige Klassenzeichenfolge', None, None)
PyEXE hab ich stundenlang versucht, aber ich komme da auf keinen grünen Zweig :(
patmaster
User
Beiträge: 106
Registriert: Donnerstag 3. Februar 2011, 17:21

Okay, dumm von mir.
Auf dem Rechner muss natürlich Word installiert sein ;)

Jetzt läuft alles!
Antworten