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

Des erreurs à la c**

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

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 ?

Édité par Cirdo

+0 -0
Staff

Cette réponse a aidé l'auteur du sujet

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 ?

+0 -0
Staff

Cette réponse a aidé l'auteur du sujet

Note que de mémoire, dans Python-Markdown, les __future__ sont surtout utilisé pour de l'import relatif, ce qui doit fonctionner out-of-the-box avec la 2.7 et est de toute façon facile a corriger.

+0 -0
Auteur du sujet

J'ai enlevé les imports __future__ et logging. Maintenant il me trouve pas le module xml.etree.ElementTree. Tu aurais une idée d'où ça peut venir Kje ?

Édité par Cirdo

+0 -0
Staff

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.

+0 -0
Auteur du sujet

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();


}
+0 -0
Staff

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.

+0 -0
Auteur du sujet

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 ?

Édité par Cirdo

+0 -0
Staff

Cette réponse a aidé l'auteur du sujet

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

+0 -0
Staff

Cette réponse a aidé l'auteur du sujet

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é…

Édité par nohar

I was a llama before it was cool

+0 -0
Auteur du sujet

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 :)

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

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