2017-12-30 6 views
1
importiert

Ich möchte meine eigene Programmiersprache basierend auf Python, die zusätzliche Funktionen, die Python nicht zur Verfügung stellen, z. B. um mehrzeilige anonyme Funktion mit benutzerdefinierter Syntax zu machen. Ich möchte, dass meine Programmiersprache so einfach zu verwenden ist, importieren Sie einfach mein Skript, dann lese ich die Skriptdatei, die mein Skript importiert, dann verarbeitet es Code und stoppe die Ausführung des Skripts, das mein Skript aufgerufen hat, um Syntaxfehler zu vermeiden. ..

Lassen Sie sagen, es gibt 2 py-Datei, main.py und MyLanguage.py
die main.py importiert MyLanguage.py
Dann, wie die main.py Datei von MyLanguage.py zu erhalten, wenn main.py kann ein anderer Name (Dynamic Name) sein?Python das Skript, das mein Skript

Zusätzliche Informationen: ich mit Python 3.4.4 auf Windows 7

+0

Ich denke, Sie verwechseln zwei Dinge: Benennen eines Python-Moduls und Benennen einer Methode (oder was auch immer) in diesem Modul definiert. Neben der Programmierung ist das Sprachdesign viel komplizierter als das, was Sie denken. – Colonder

+0

Sie können jedoch https://StackOverflow.com/questions/301134/dynamic-module-import-in-python – Colonder

Antwort

3

Wie Colonder, glaube ich, das Projekt, das Sie im Sinn haben, weitaus schwieriger ist als man sich vorstellen.

Aber um Sie zu beginnen, hier ist, wie Sie die main.py Datei von innerhalb MyLanguage.py bekommen. Wenn Ihr Import-Modul sieht wie folgt aus

# main.py 
import MyLanguage 

if __name__ == "__main__": 
    print("Hello world from main.py") 

und das Modul wird wie folgt aussieht, in Python 3 importieren:

#MyLanguage.py 
import inspect 

def caller_discoverer(): 
    print('Importing file is', inspect.stack()[-1].filename) 

caller_discoverer() 

oder (bearbeiten) wie folgt, in Python 2:

#MyLanguage.py 
import inspect 

def caller_discoverer(): 
    print 'Importing file is', inspect.stack()[-1][1] 

caller_discoverer() 

dann die Ausgabe, die Sie erhalten, wenn Sie main.py laufen ist

Importing file is E:/..blahblahblah../StackOverflow-3.6/48034902/main.py 
Hello world from main.py 

Ich glaube, das beantwortet die Frage, die Sie gestellt haben, obwohl ich nicht glaube, dass es sehr weit geht, um das zu erreichen, was Sie wollen. Der Grund für meine Skepsis ist einfach: Die import Anweisung erwartet eine Datei mit gültigem Python, und wenn Sie eine Datei mit Ihrer eigenen Nicht-Python Syntax importieren wollen, dann müssen Sie einige sehr clevere Sachen mit importieren Haken. Ohne das wird Ihr Programm einfach bei der import-Anweisung mit einem Syntaxfehler fehlschlagen.

Viel Glück.

+0

Ich habe versucht, den Code, den Sie oben angegeben haben, auszuführen, und ich habe diesen Fehler: 'AttributError: 'Tupel' Objekt hat kein Attribut 'filename' in "MyLanguage.py", Zeile 5, in caller_discoverer – KhunRan

+0

Wenn ich diese Zeile zu caller_discoverer 'global a a = inspect.stack()' hinzufügen und einen Code in main.py 'for hinzufügen Ich in MyLanguage.a: \t Drucken (ich [1]) 'dann habe ich' D:/Projekte/Python/Test \ MyLanguage.py D:/Test \ MyLanguage.py \ n \ n \ n \ n \ n \ n \ n D:/Test/main.py \ n C: \ Python34 \ lib \ idleLib \ run.py \ n C: \ Python34 \ lib \ idleLib \ run.py \ 'was bedeutet, dass der Pfad main.py nicht bei [-1 liegt ] – KhunRan

+0

Ihre Frage ist mit Python-3.x markiert und ich weiß, dass Sie glauben, dass Sie Python 3 ausführen, aber der Fehler, den Sie melden: 'AttributeError: 'Tuple' Objekt hat kein Attribut 'Dateiname' ist genau das, was ich bekomme, wenn ich laufe der Code in der Antwort unter Python 2.7.13. Ich habe die Antwort bearbeitet, um Ihnen zu zeigen, was Sie in Python 2 tun müssen. Für die Python 2-Version habe ich absichtlich "print" in "MyLanguage.py" von etwas, das ein Funktionsaufruf sein könnte, in eine Anweisung geändert. Wenn Sie Python 3 ausführen, erhalten Sie an dieser Stelle einen Syntaxfehler. Wenn Sie Python 2 ausführen, werden Sie nicht. – BoarGules

Verwandte Themen