2016-05-13 2 views
0

Je cours un tas de scripts et généralement je stocke leur résultat dans un MongoDB. Pour être sûr de pouvoir lier les résultats avec le script d'entrée, je stocke le script entier sous forme de texte. Cela fonctionne à merveille en Python 3 en utilisant le fragment de code suivant:Conversion du script * .py en une chaîne

module = importlib.import_module(module) 
    with open(module.__file__) as ff: 
     source = ff.read() 

En appliquant la même astuce en Python 2 résultats dans un désordre. Initialement, le module variable est une chaîne telle que a.b.foo. Malheureusement, je ne peux pas encore abolir Python 2.

+1

Que voulez-vous dire par « un gâchis »? Est-ce qu'il lance une erreur? Est-ce que le résultat diffère de vos attentes? Peut-être que c'est une erreur d'encodage? – syntonym

+0

L'instruction with peut ne pas être incluse dans les premières versions de Python 2.x – linusg

+0

J'utilise 2.7.10 – tschm

Répondre

2

Dans la plupart des cas, vous n'obtenez pas le fichier * .py avec __file__ mais le fichier * .pyc. Ce qui dans votre cas est en effet un gâchis. Il suffit de couper le dernier caractère du nom de fichier;)

import os 
import importlib 

#new_module = __import__("module") 
new_module = importlib.import_module("module") 

new_module_filename = os.path.realpath(new_module.__file__) 
if new_module_filename.endswith(".pyc"): 
    new_module_filename = new_module_filename[:-1] 

with open(new_module_filename) as ff: 
    source = ff.read() 
print(source) 
+0

Gosh, c'est un peu un hack. Accéder à un membre "privé" de l'objet module, puis manipuler la chaîne résultante. Cela fonctionne cependant :-) Merci – tschm

+0

Vous êtes les bienvenus ¯ \ _ (ツ) _/¯ – salomonderossi

0

Vous pouvez simplement faire:

import sys 
f= open(sys.argv[0]) 
content = f.read() 
print content