C++ und Python

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Centurius
User
Beiträge: 22
Registriert: Dienstag 14. März 2017, 14:09

Dienstag 14. März 2017, 14:17

Guten Tag,

ich habe ein Programm geschrieben, das in der Lage ist Python Scripte reinzuladen. Zur Zeit lade ich über die Funktion PyImport_Import die Scripts rein und das klappt alles soweit.

Nur was ist der Unterschied zu PyImport_ImportModule?

Ist es möglich das ein Script, das reingeladen wurde, in ein anderes Script zu importieren? Also sprich es werden Test1.py und Test2.py reingeladen. Nun möchte ich gerne in Test2.py import Test1 nutzen ohne das sie im selben Ordner sind oder ist es anders möglich an die Funktionen von Test1.py zukommen?

Gibt es außerdem eine Möglichkeit "import os" zu verbieten und es um "import MySQLdb" zu erlauben?
Sirius3
User
Beiträge: 8830
Registriert: Sonntag 21. Oktober 2012, 17:20

Dienstag 14. März 2017, 14:49

@Centurius: der Unterschied steht in der Dokumentation. Bei PyImport_Import: This is a higher-level interface that calls the current “import hook function”, PyImport_ImportModule umgeht eventuelle Hooks und ruft das Ursprüngliche __import __ direkt auf.

Ja, man kann Test1 in Test2 importieren: Mit import.

Es macht keinen Sinn, irgendwo "import os" zu verbieten. Wenn Du bestimmte Systemfunktionen verbieten willst, mußt Du einige Ebenen tiefer ansetzen. Das sauber umzusetzen ist so gut wie unmöglich, wenn Du auch noch an einigen Stellen mehr erlauben willst als an anderen.
Centurius
User
Beiträge: 22
Registriert: Dienstag 14. März 2017, 14:09

Dienstag 14. März 2017, 15:03

Danke für deine Antwort! :)

Ich würde aus Sicherheitsaspekten gerne alle OS.* Funktionen verbieten wollen.

Ne das Importieren funktioniert bei mir nicht.
__deets__
User
Beiträge: 4034
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dienstag 14. März 2017, 15:15

Wir verstehen schon warum du das willst. Es ist ein immer wieder und immer wieder erfolglos diskutiertes Thema, dessen Antwort ist: geht nicht. Es gibt eine Zillion Moeglichkeiten, an die entsprechenden Funktionen zu kommen.
BlackJack

Dienstag 14. März 2017, 15:16

@Centurius: Das mit den `os`-Funktionen musst Du ausserhalb von Python lösen und dann aber auch bedenken was denn passieren soll wenn irgendein Modul solche Funktionen verwenden will. Also zum Beispiel ein Datenbankmodul. Es ist also letztendlich innerhalb von Python nicbt möglich. Darauf ist die Python-Laufzeitumgebung nicht ausgelegt. Es gab in der Standardbibliothek mal ein Modul für ”Sandkästen”, das ist aber rausgeflogen weil jahrelang immer wieder neue Möglichkeiten gefunden wurden da auszubrechen. Pack Deinen kompletten Prozess in eine chroot-Umgebung oder etwas vergleichbares.
Centurius
User
Beiträge: 22
Registriert: Dienstag 14. März 2017, 14:09

Dienstag 14. März 2017, 15:29

Gut, dann gebe ich mich damit zufrieden.

Nur ein Problem mit dem import besteht noch.
Kann das sein, das es daran liegt, das ich vor dem PyImport_Import mit PySys_SetPath das Verzeichnis ändere, das er deshalb das andere Script nicht findet?

Gibt es noch eine andere Möglichkeit bei PyImport_Import das Verzeichnis mit anzugeben?
BlackJack

Dienstag 14. März 2017, 16:49

@Centurius: Was heisst ”ändern”? Den sollte man natürlich nur erweitern. Wenn man da Pfade rauslöscht von denen schon importiert wurde, könnte das lustige Effekte haben wenn versucht wird daraus später noch mal oder noch mehr zu importieren.
Centurius
User
Beiträge: 22
Registriert: Dienstag 14. März 2017, 14:09

Mittwoch 15. März 2017, 13:25

Gibt es eine Möglichkeit, das ich zum Beispiel die Funktion print überschreibe?
Sirius3
User
Beiträge: 8830
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 15. März 2017, 13:47

@Centurius: ja?

Code: Alles auswählen

print = irgendwas_anderes
Centurius
User
Beiträge: 22
Registriert: Dienstag 14. März 2017, 14:09

Mittwoch 15. März 2017, 14:39

Sirius3 hat geschrieben:@Centurius: ja?

Code: Alles auswählen

print = irgendwas_anderes
Auch so das bei jedem PyImport_Import diese Funktionen überschrieben werden? Also das ich es im C++ Code angebe
BlackJack

Mittwoch 15. März 2017, 14:55

@Centurius: Wenn Du es im `__builtins__`- bzw. `builtins`-Modul überschreibst, dann gilt es überall.
Centurius
User
Beiträge: 22
Registriert: Dienstag 14. März 2017, 14:09

Mittwoch 15. März 2017, 15:22

BlackJack hat geschrieben:@Centurius: Wenn Du es im `__builtins__`- bzw. `builtins`-Modul überschreibst, dann gilt es überall.
Ähm, ich weiß nicht so genau was ich jetzt machen soll^^

Also vielleicht erläutere ich mal meine Problemstellung genau. Ich habe eine Module für Python gebaut und das lass ich mit "PyImport_AppendInittab" reinladen.
Als nächstes werden mehrere Python Scripts (PyImport_Import) geladen, die mit "Import Module" das Module importieren und die Funktionen des Modules ausführen.

Nun möchte ich gerne das automatisch die print Funktion überschrieben wird mit einer C++ Funktion.
Könnte ich das in das Module mit einbauen?
BlackJack

Mittwoch 15. März 2017, 16:39

@Centurius: Wenn Du `print()` generell durch ein eigenes austauschen möchtest, dann müsstest Du das `__builtin__`- (Python 2) oder `builtins`-Modul (Python 3) importieren und die dort vorhandene `print`-Funktion durch eine eigene Funktion (mit kompatibler Signatur) ersetzen. Also in Python (2):

Code: Alles auswählen

from __future__ import print_function
import __builtin__

def print(…):
    …

__builtin__.print = print
Centurius
User
Beiträge: 22
Registriert: Dienstag 14. März 2017, 14:09

Mittwoch 15. März 2017, 17:16

Kann ich das auch in C++ programmieren?
BlackJack

Mittwoch 15. März 2017, 17:29

@Centurius: Ja, natürlich kann man alles was in Python gemacht wird auch über die API von C oder C++ aus gemacht werden. Deine `print()`-Funktion musst Du dann in einem Modul haben, das und das `__builtin__`/`builtins`-Modul importieren und dann das `print`-Attribut vom einen Modul abfragen und beim anderen Modul setzen.
Antworten