Question

* PyObject PyImport_ImportModule (const char * nom)

Comment spécifier un chemin complet du fichier à la place et un nom de module?

Comme PyImport_SomeFunction(const char *path_to_script, const char *name)

Merci, Elias

Était-ce utile?

La solution 4

Finalement, je me suis retrouvée à l'aide du load_source du module diablotin:

s.sprintf( 
  "import imp\n" 
  "imp.load_source('%s', r'%s')", modname, script_path); 
PyRun_SimpleString(s.c_str()); 

Je pense qu'il est la solution la plus réalisable. D'autres suggestions sont les bienvenus.

Autres conseils

Une autre solution pour les cas où tout fichier * .py sont dans un répertoire:

PySys_SetPath("path/with/python/files");
PyObject *pModule = PyImport_ImportModule("filename_without_extension");

Je ne peux pas vous donner une réponse complète, mais je pense que je peux vous donner un endroit pour commencer. Python fournit un module intégré appelé imp qui donne accès aux éléments internes à l'importation. Il comprend une load_module de fonction () qui vous permet de passer dans un chemin. Ceci est mis en œuvre dans Python / import.c ; recherche juste pour imp_load_module.

Comme l'a souligné, en utilisant la solution ci-dessus par AlexP, vous ne pouvez pas importer des modules en dehors du répertoire spécifié. Cependant, au lieu de réglage le chemin, vous pouvez ajouter un chemin qui est à rechercher des modules. Cela peut se faire en ajoutant ce chemin sys.path . Malheureusement, l'API C n'expose pas une fonction qui est en mesure de le faire directement. Au lieu de cela, vous pouvez demander Python lui-même de le faire, en utilisant

PyRun_SimpleString( "import sys\nsys.path.append(\"<insert folder path>\")\n" );

ou tout équivalent comme: (avertissement: non testé)

PyObject* sys = PyImport_ImportModule( "sys" );
PyObject* sys_path = PyObject_GetAttrString( sys, "path" );
PyObject* folder_path = PyUnicode_FromString( "<insert folder path>" );
PyList_Append( sys_path, folder_path );

Maintenant, vous pouvez importer tout <insert folder path>/<file>.py de fichier en utilisant l'habituel

PyObject* mymodule = PyImport_ImportModule( "<file>" );

Pour consulter le répertoire en cours, utilisez simplement "." comme le chemin du dossier.

pas hésiter appeler par la module imp d'effectuer des travaux d'importation, donc il n'y a aucune raison que vous ne devriez pas le faire vous-même.

Voici une façon de le faire en C ++, où modulePath et moduleName sont variables distinctes en raison de la paresse:

PyObject* loadModule(const char* modulePath, const char* moduleName)
{
    auto modules = PyImport_GetModuleDict();
    auto impModule = PyDict_GetItemString(modules, "imp");
    if (impModule)
    {
        // GetItemString returns a borrowed reference, but ImportModule
        // returns a new reference, so INCREF here to even it out
        Py_INCREF(impModule);
    }
    else
    {
        impModule = PyImport_ImportModule("imp");
        if (!impModule)
        {
            // we've tried hard enough, bail out
            PyErr_Print();
            return nullptr;
        }
    }

    // The Python API asks for non-const char pointers :(
    char methodName[] = "load_source";
    char args[] = "ss";
    auto module = PyObject_CallMethod(impModule, methodName, args, moduleName, modulePath);

    Py_XDECREF(impModule);
    Py_XDECREF(modulePath);
    return module;
}

J'ai écrit ce basé sur un de mes projets chargeur module Python , qui utilise la gestion colombophile refcount, et je ne l'ai pas essayé celui-ci, donc à utiliser à vos propres risques.

J'ai vérifié que l'alternative de stesim fonctionne.

Quelle que soit la solution est utilisée, il est important de mentionner que sur les fenêtres, il est important d'avoir le chemin complet avec des barres obliques au lieu de barres obliques inverses.

path = "C:\\path\\to\\module\\module.py" // wrong
path = "C:/path/to/module/module.py"     // correct

Dans d'autres questions et réponses (comme chemin Windows en python ), il est indiqué, que la première variante devrait fonctionner aussi. Je ne pouvais pas le faire fonctionner de cette façon quelle que soit la méthode que j'ai essayé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top