Heißt das, man kann nur Code in den gefundenen importieren oder sind sie da auch nicht bekannt? Hattest du nicht gesagt, dass es geht?
Heißt das, man kann nur Code in den gefundenen importieren oder sind sie da auch nicht bekannt? Hattest du nicht gesagt, dass es geht?
Es geht überhaupt nicht. Was zur Hölle hat Firaxis gemacht? Normalerweise sollte das Python können.
Ich habe es gechafft. Ich habe mir gedacht, weil die Civ4-Programmierer so wahnsinnig gute Python-Kenntnisse haben, dass sie bestimmt nicht das sys-Modul kennen, welches unter anderem die Möglichkeit bietet, zur Laufzeit den Suchpfad von Python anzupassen.
Zu meinen Test: Ich habe den normalen EventManager genommen, und wollte ein neues Modul (.pyd) dort importieren lassen. Das gingt erst nicht, da kam der Fehler mit dem import.
Als ich dann im EventManager oben die Zeilen
import sys
sys.path.append(Pfad-zum-Python-Verzeichnis)
eingegeben habe, ging es.
Ein großer Dank geht schon mal für deine Aufwendung.
Heißt also, man sollte in jedes Pythonfile oben
hinzufügen?import sys
sys.path.append(Pfad-zum-Python-Verzeichnis)
Das hört sich einfach an.
edit: Wie bestimme ich den Pfad nur? Den Pfad muss ich ja relativ angeben können.
edit2:
Verstehe ich richtig, dass auf den BTS Pythonpfad normalerweiße gezeigt wird? Was Civ 4 intern nicht als dort enthalten betrachtet, wird nicht gefunden?
Hoffe das macht damit keine Probleme in Base.Code:MyFile=open("Mods/BASE 5.4/Assets/XML/CustomXML/"+MapName+"_StartingPoints.xml")
Geändert von rucivfan (05. September 2013 um 12:10 Uhr)
Normalerweise würde es reichen, in einem Modul das zu machen. Wenn ein bereits importiertes Modul wieder (in einem anderen Modul) importiert wird, dann findet in Wahrheit kein import statt.
Es sei denn natürlich, man ändert das import verhalten, so dass dann immer ein neu-laden stattfindet.
sys wird nämlich doch verwendet - in verschiedenen Modulen. Dadurch wird sys neugeladen, wodurch sys.path wohl zurückgesetzt wird...
Es gibt das Modul os.
Mit os.getcwd() kann man das Arbeitsverzeichnis herausfinden. Das sollte das BtS-Verteichnis sein, da dort die exe liegt. Von da aus ist es ein leichtes, auf den Python-Order der Mod zu schließen. Nur der Modname muss vorausgesetzt werden.
Ich beschäftige mich gerade mit der Umsetzung. Ich frage mich überhaupt, warum sys jedes mal neugeladen werden sollte, wenn es doch importiert ist?
Oder ist
eine Feststellung? Das ist nicht so richtig herauslesbar.Es sei denn natürlich, man ändert das import verhalten, so dass dann immer ein neu-laden stattfindet.
Ich denke mal, das da irgendwas geändert wurde. Weil wenn man im Spiel ist, und z.B. beim EventManager was ändert und speichert, dann wird das Modul neu geladen.
Aber so genau weis ich das nun auch nicht, was da so abgeht.
Auf jeden Fall muss man, um die .pyd Datein zu importieren, vorher erst sys.path erweitern.
Das hätten sie schön bleiben lassen sollen. Mitten im Spiel kann es schon mal zum Absturz kommen. Ich muss dafür immer in das Menü.
eeeeigentlich hat bug mod damit geworben auch im Spiel Python verändern zu können. ging aber nie richtig. sobald man einmal nen spiel offen hatte, hilft nur ein neustart nach einer Modifikation.
Pucc's Lets Plays BASE 6.0: #1 #2 #3 #4 #5
Download von BASE 6.4 [D]: HIER (klick mich!) (Stand: 08.07.2022)
Wird das auch nur einmal importiert oder jedes mal wieder neu? Der Witz ist, oben in der Datei steht noch mal ein Import sysCode:def onPbemSend(argsList): import sys, smtplib, MimeWriter, base64, StringIO
Das zweite sys ist wirklich unnötig.
Module, innerhalb von Funktionen importiert, werden erst dann importiert, wenn die Funktion aufgerufen wird. Normalerweise nur einmal (wie gewöhnliche Modulimporte auch).
Allerdings ist das übler Stil.
Mein erster richtiger Erfahrungsbericht mit Cythoncode:
Ausgetasucht habe ich erstmal nur wieder die PLE.py mit PLE.pyd, was in Base für das Einheiteninterface zuständig ist.
Damit meine ich die kleinen Symbole unter den Einheiten auf dem Bild. Ich werde dann noch mal ohne Cython ausprobieren um einen direkten Vergleich zu haben, aber es ist eindeutig eine wesentliche Verbesserung!
Es dauert nur noch fast Echtzeit, die Einheitenanzeige dort umzustellen.
Mit Echtzeit meine ich weniger als eine 1 Sekunde warten.
(Verdammt, jetzt muss ich mir das auch angucken )
Man kann viel mehr Optimieren.
Man kann z.B. etwas statische Typisierung rein bringen, da wo es sinn macht. Das geht aber nur mit den Grundtypen (int u.ä.), und eigenen, mit Cython erstellen Typen.
Was viel mehr bringen wird ist das folgende: man kann Python-Funktionen zu C-Funktionen machen (der Funktionsdefinition wird einfach ein bestimmtes Schlüsselwort vorangestellt), dadurch gewinnt man mehr Geschwindigkeit. Der Nachteil ist aber, das solche Funktionen nur von dem Modul selbst verwendet werden können. D.h. andere Module können diese Funktionen nicht verwenden.
Deswegen ist es wichtig, die Module entsprechend zu designen.
Dann gibt es noch diverse Compiler-Optionen, z.B. kann man die Indexüberprüfung ausschalten, entweder global für das ganze Modul oder für spezielle Funktionen.
Hinzukommt noch, dass ich mit einer Debug.dll mit der Entwicklungsumgebung im Hintergrund am laufen war.