2012-08-05 27 views
6

Quiero escribir un guión (generate_script.py) generar otra secuencia de comandos Python (filegenerated.py)¿Cuál es la mejor manera de escribir el código python en un archivo python?

generate_script.py Hasta ahora he creado:

import os 
filepath = os.getcwd() 
def MakeFile(file_name): 
    temp_path = filepath + file_name 
    file = open(file_name, 'w') 
    file.write('def print_success():') 
    file.write(' print "sucesss"') 
    file.close() 
    print 'Execution completed.' 

El archivo (filegenerated.py) miradas ahora así:

def print_success(): print "sucesss"

ahora no w y para insertar manualmente todos los saltos de línea (también debido a las dificultades del sistema operativo) ... ¿hay un sistema de plantillas que pueda usar para escribir el código de Python en un archivo de Python? ¿Alguien tiene un ejemplo?

¡Muchas gracias!

+0

Qué sistemas plantilla has encontrado que no puede generar código Python? –

+0

Pruebe las plantillas de mako: http://www.makotemplates.org/ – robert

+0

Python maneja las nuevas líneas de una manera universal; escribir líneas nuevas en modo texto escribirá los finales de línea correctos para su plataforma. –

Respuesta

4

Se podía utilizar una cadena de varias líneas:

import os 
filepath = os.getcwd() 
def MakeFile(file_name): 
    temp_path = filepath + file_name 
    with open(file_name, 'w') as f: 
     f.write('''\ 
def print_success(): 
    print "sucesss"   
''') 
    print 'Execution completed.' 

Si te gusta el código de la plantilla tenga una sangría junto con el resto de su código, pero dedented cuando se escriben en un archivo separado, se puede usar textwrap.dedent:

import os 
import textwrap 

filepath = os.getcwd() 
def MakeFile(file_name): 
    temp_path = filepath + file_name 
    with open(file_name, 'w') as f: 
     f.write(textwrap.dedent('''\ 
      def print_success(): 
       print "sucesss"   
       ''')) 
    print 'Execution completed.' 
+0

bien poner eso en una cuerda grande es para mí ahora bastante conveniente! Gracias – Jurudocs

3

Trate de usar \ n \ t

import os 
filepath = os.getcwd() 
def MakeFile(file_name): 
    temp_path = filepath + file_name 
    file = open(file_name, 'w') 
    file.write('def print_success():\n') 
    file.write('\tprint "sucesss"') 
    file.close() 
    print 'Execution completed.' 

a outp ut

def print_success(): 
    print "sucesss" 

o de varias líneas

import os 
filepath = os.getcwd() 
def MakeFile(file_name): 
    temp_path = filepath + file_name 
    file = open(file_name, 'w') 
    file.write(''' 
def print_success(): 
    print "sucesss" 
    ''') 
    file.close() 
    print 'Execution completed.' 
+1

Es bueno señalar que '\ t' da un carácter de tabulación, pero PEP8 dice que cuatro espacios es el estándar preferido para la sangría. –

5
lines = [] 
lines.append('def print_success():') 
lines.append(' print "sucesss"') 
"\n".join(lines) 

Si usted está construyendo algo compleja dinámica:

class CodeBlock(): 
    def __init__(self, head, block): 
     self.head = head 
     self.block = block 
    def __str__(self, indent=""): 
     result = indent + self.head + ":\n" 
     indent += " " 
     for block in self.block: 
      if isinstance(block, CodeBlock): 
       result += block.__str__(indent) 
      else: 
       result += indent + block + "\n" 
     return result 

Se podría añadir algunos métodos adicionales, para añadir nuevas líneas al bloque y todo eso, pero creo que entiendes la idea ...

Ejemplo:

ifblock = CodeBlock('if x>0', ['print x', 'print "Finished."']) 
block = CodeBlock('def print_success(x)', [ifblock, 'print "Def finished"']) 
print block 

Salida:

def print_success(x): 
    if x>0: 
     print x 
     print "Finished." 
    print "Def finished." 
+0

muy elegante también ;-) – Jurudocs

+0

nice edit! ¡Definitivamente es la solución para un código más complejo ...! – Jurudocs

2

respuesta untubu es probablemente la respuesta más Pythonic, pero en el ejemplo de código que se está perdiendo nuevos caracteres de línea y las pestañas.

file.write("def print_success():\n") 
file.write('\tprint "success"\n\n') 

Esto le dará el espacio y las nuevas líneas. El siguiente enlace le dará algunos consejos sobre los aceptados.

http://docs.python.org/release/2.5.2/ref/strings.html

Cuestiones relacionadas