Des erreurs d'imports avec l'api python en C

Des erreurs à la c**

Le problème exposé dans ce sujet a été résolu.

Salut à tous,

Depuis peu pour un projet d'éditeur/lecteur pour ZDS, je dois transformer un texte au format markdown au format HTML. Mon programme tourne en c (Objective-c pour être précis mais peut importe car on peut utiliser du code c dans du code objective-c :) ). J'ai créé une fonction python dans un fichier à part.

1
2
3
4
5
6
7
from markdown import Markdown
from markdown.extensions.zds import ZdsExtension
from smileys_definition import smileys

def markdown_python(markdown_string):
    render = Markdown(extensions=(ZdsExtension({'inline': False, 'emoticons': smileys}),),safe_mode = 'escape', enable_attributes = False, tab_length = 4, output_format = 'html5', smart_emphasis = True, lazy_ol = True).convert(markdown_string)
    return render

Jusqu'à là rien de sorcier.

Le module markdown gère des dépendances qui sont : __future__, codecs

Les ressources (image, fichier python…) des applications Cocoa généré par xCode sont dans le fichier Resources. Quand mon application s'execute, j'ai bien mes fichiers python mais j'ai une erreur d'import.

Le code c :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include "ZDSMarkdown.h"

PyObject *module, *argument, *function, *ret;
void renderMarkdown(char *markdown){


    Py_NoSiteFlag = 1;
    Py_FrozenFlag = 1;
    Py_IgnoreEnvironmentFlag = 1;



    char buf[2048]; //Variable (mal nommée) du chemin où se trouve les fichiers python
    getcwd(buf, sizeof(buf));
    strcat(buf, "/iZeste.app/Contents/Resources");
    printf("%s\n",buf);
    Py_SetPythonHome(buf);
    Py_Initialize();
    printf("%s\n", PY_VERSION);
    PySys_SetPath(buf);

    module = PyImport_ImportModule("markdownHtml");


    if (module){
        argument = Py_BuildValue("(s)", markdown);
        function = PyObject_GetAttrString(module,"markdown_python");
        ret = PyEval_CallObject(function, argument);

        if (PyString_Check(ret)){
            printf("%s", PyString_AS_STRING(ret));
        }
    }
    PyErr_Print();

    Py_DECREF(function);
    Py_DECREF(module);
    Py_DECREF(argument);
    Py_DECREF(ret);
    Py_Finalize();


}

La fonction PyErr_Print(); me sort :

1
2
3
4
5
6
Traceback (most recent call last):
  File "/Users/Cirdo/Library/Developer/Xcode/DerivedData/iZeste-dycjahkgbpkxjmbmznckrqticjxv/Build/Products/Debug/iZeste.app/Contents/Resources/markdownHtml.py", line 1, in <module>
    from markdown import Markdown
  File "/Users/Cirdo/Library/Developer/Xcode/DerivedData/iZeste-dycjahkgbpkxjmbmznckrqticjxv/Build/Products/Debug/iZeste.app/Contents/Resources/markdown/__init__.py", line 33, in <module>
    from __future__ import absolute_import
ImportError: No module named __future__

Il me trouve pas le module __future__. Où est ce module ? Comment faire pour l'intégrer ?

+0 -0

Ce module est un module particulier qui inclus des fonctionnalités récentes qui permet de les utiliser dans les vieilles versions de python. Bref il n'existe pas en tant que tel, il est inclus dans l'interpréteur normalement. C'est quoi ta version de python que tu utilise ?

C'est censé etre dans la lib standard. Tu es surs que ton code initialise correctement l'interpréteur ? J'ai l'impression qu'il ne trouve rien de ce qui est dans la lib standard. Ton python path il a quelle tête ? Car là visiblement tu ne trouve rien de la lib standard.

Effectivement il contient rien, c'est à cause de la ligne PySys_SetPath(buf);. Il met mon path dans mon fichier Resources, du coup pas de lib :)

La fonction Py_SetPythonHome(buf); n'a pas trop l'air de fonctionner. Avant l'appelle de la fonction, le PythonHome est NULL. Après elle me donne le chemin des resources : /Users/Cirdo/Library/Developer/Xcode/DerivedData/iZeste-dycjahkgbpkxjmbmznckrqticjxv/Build/Products/Debug/iZeste.app/Contents/Resources/

Ensuite j'ai une erreur d'import pour mon fichier markdownHmlt.

Je redonne le code (test) :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
PyObject *module, *argument, *function, *ret;
void renderMarkdown(char *markdown){


    Py_NoSiteFlag = 1;
    Py_FrozenFlag = 1;
    Py_IgnoreEnvironmentFlag = 1;
    Py_SetProgramName((""));


    char buf[2048];
    getcwd(buf, sizeof(buf));
    strcat(buf, "/iZeste.app/Contents/Resources/");
    printf("%s\n",buf); ///Users/Cirdo/Library/Developer/Xcode/DerivedData/iZeste-dycjahkgbpkxjmbmznckrqticjxv/Build/Products/Debug/iZeste.app/Contents/Resources/

    printf("%s\n", Py_GetPythonHome()); //NULL
    Py_SetPythonHome(buf);
    printf("%s\nr", Py_GetPythonHome()); ///Users/Cirdo/Library/Developer/Xcode/DerivedData/iZeste-dycjahkgbpkxjmbmznckrqticjxv/Build/Products/Debug/iZeste.app/Contents/Resources/

    Py_Initialize();
    printf("%s\n", PY_VERSION); //2.7.6
    PySys_SetPath(".");
   // Py_SetPythonHome(buf);


    module = PyImport_ImportModule("markdownHtml");


    if (module){
        argument = Py_BuildValue("(s)", markdown);
        function = PyObject_GetAttrString(module,"markdown_python");
        ret = PyEval_CallObject(function, argument);

        if (PyString_Check(ret)){
            printf("%s", PyString_AS_STRING(ret));
        }
    }
    PyErr_Print();

    Py_DECREF(function);
    Py_DECREF(module);
    Py_DECREF(argument);
    Py_DECREF(ret);
    Py_Finalize();


}

Rétabli le code du markdown a ce qu'il est d'origine, corrige le problème de path et dit nous ce que tu as comme message d'erreur.

Note que ca aurait été probablement plus facile pour toi d'appeler le code comme processus extérieur plutot que tout intégrer ainsi.

J'ai rétablie le code, j'ai mis le code du début du topic (Sinon j'ai pas bien compris ce que tu voulais me dire :) ). J'ai toujours la même erreur. La variable, bufest correcte car j'arrive en la copiant à accéder à Resources.

Note que ca aurait été probablement plus facile pour toi d'appeler le code comme processus extérieur plutot que tout intégrer ainsi.

Kje

Je sais pas si en faisant un utilitaire ça serait plus rapide ?

+0 -0

Il faut absolument que le path vers la lib standard soit correct mais je ne connais pas assez l'api C pour t'aider.

PS: Python-Markdown a déjà une interface utilitaire en ligne de commande, il doit pas y avoir grand chose a faire pour tenir compte des extension

Par ailleurs, utiliser l'API C toute nue m'a toujours semblé risqué. Pourquoi ne pas passer par Cython, plutôt ? Tu y gagnerais en temps de développement, en temps de debug, en sécurité, en compatibilité…

+0 -0

Par ailleurs, utiliser l'API C toute nue m'a toujours semblé risqué. Pourquoi ne pas passer par Cython, plutôt ? Tu y gagnerais en temps de développement, en temps de debug, en sécurité, en compatibilité…

nohar

Je crois que je vais utiliser Cython, je pense que ça serait plus simple. Il faudra executer le fichier en asynchrones par contre.

En tout cas merci Kje, merci nohar :)

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte