2012-09-13 18 views
26

Tengo un código que deseo dividir en varios archivos. En matlab uno simplemente puede llamar a un archivo .m, y mientras no esté definido como algo en particular, simplemente se ejecutará como si fuera parte del código llamado. Ejemplo (editado):
test.m (MATLAB)dividir el código fuente de Python en varios archivos?

function [] = test() 
    ... some code using variables ... 
    test2 

test2.m (MATLAB)

... some more code using same variables ... 

Calling test ejecuta el código en la prueba, así como el código en test2.

¿Hay una manera similar para python, poner ... some more code ..., en un archivo externo, que simplemente se leerá como si estuviera en el archivo desde el que se llama?

+1

Sí, existe la posibilidad de dividir los archivos en diferentes módulos e importar lo que necesita. http://docs.python.org/tutorial/modules.html – Borgleader

+2

Lea su tutorial favorito de Python y aprenda sobre los módulos –

Respuesta

17

Estoy investigando el uso de módulos en python en este momento y pensé que respondería la pregunta que Markus hace en los comentarios anteriores ("¿Cómo importar variables cuando están integradas en módulos?") Desde dos perspectivas:.

  1. variables/funciones, y
  2. propiedad
  3. clase/método

Aquí es cómo iba a reescribir el programa principal f1.py para demostrar la reutilización variable para Markus:

import f2 
myStorage = f2.useMyVars(0) # initialze class and properties 
for i in range(0,10): 
    print "Hello, " 
    f2.print_world() 
    myStorage.setMyVar(i) 
    f2.inc_gMyVar() 
print "Display class property myVar:", myStorage.getMyVar() 
print "Display global variable gMyVar:", f2.get_gMyVar() 

Aquí es cómo iba a reescribir el módulo reutilizable f2.py:

# Module: f2.py 
# Example 1: functions to store and retrieve global variables 
gMyVar = 0 
def print_world(): 
    print "World!" 
def get_gMyVar(): 
    return gMyVar # no need for global statement 
def inc_gMyVar(): 
    global gMyVar 
    gMyVar += 1 

# Example 2: class methods to store and retrieve properties 
class useMyVars(object): 
    def __init__(self, myVar): 
     self.myVar = myVar 
    def getMyVar(self): 
     return self.myVar 
    def setMyVar(self, myVar): 
     self.myVar = myVar 
    def print_helloWorld(self): 
     print "Hello, World!" 

Cuando se ejecuta f1.py aquí es lo que la salida es parecida:

%run "f1.py" 
Hello, 
World! 
Hello, 
World! 
Hello, 
World! 
Hello, 
World! 
Hello, 
World! 
Hello, 
World! 
Hello, 
World! 
Hello, 
World! 
Hello, 
World! 
Hello, 
World! 
Display class property myVar: 9 
Display global variable gMyVar: 10 

Creo que el punto de Markus sería:

  • Para volver a utilizar el código de un módulo más de una vez, poner el código de su módulo en funciones o clases,
  • Para volver a utilizar las variables almacenadas como propiedades en módulos, inicializar propiedades dentro de una clase y añadir "getter" y "setter métodos" por loLas variablesno tienen que copiarse en el programa principal,
  • Para reutilizar las variables almacenadas en los módulos, inicialice las variables y use las funciones getter y setter . Las funciones del colocador declararían las variables como globales.
18

Python tiene importación y espacio de nombres, que son buenos. En Python puede importar en el espacio de nombres actual, como:

>>> from test import disp 
>>> disp('World!') 

O con un espacio de nombres:

>>> import test 
>>> test.disp('World!') 
+11

"que son buenos" +1 para una muy buena descripción. – mgilson

34

Claro!

#file -- test.py -- 
myvar = 42 
def test_func(): 
    print("Hello!") 

Ahora, este archivo ("test.py") está en la terminología de Python como "módulo". Podemos importar (con tal de que se puede encontrar en nuestra PYTHONPATH) Tenga en cuenta que el directorio actual está siempre en PYTHONPATH, por lo que si use_test se ejecuta desde el mismo directorio donde test.py vidas, ya está todo listo:

#file -- use_test.py -- 
import test 
test.test_func() #prints "Hello!" 
print (test.myvar) #prints 42 

from test import test_funC#Only import the function directly into current namespace 
test_func() #prints "Hello" 
print (myvar)  #Exception (NameError) 

from test import * 
test_func() #prints "Hello" 
print(myvar)  #prints 42 

Hay mucho más que puedes hacer que solo mediante el uso de archivos especiales __init__.py que te permiten tratar múltiples archivos como un solo módulo), pero esto responde a tu pregunta y supongo que dejaremos el resto para otro momento .

+0

Bueno, tal vez mi ejemplo no sea tan bueno. Deseo poder llamar a mi código adicional, con todas mis variables. Importar el módulo no me ayuda mucho ya que necesitaría transferir las variables, ¿no? – Markus

+1

Las variables se pueden importar también, aunque no es muy común y normalmente no desea hacer eso ... (ver mi actualización) – mgilson

2

Puede hacer lo mismo en python simplemente importando el segundo archivo, el código en el nivel superior se ejecutará cuando se importe. Sugeriría que esto es desordenado en el mejor de los casos, y no una buena práctica de programación. Usted sería mejor organizar el código en modules

Ejemplo:

F1.py:

print "Hello, " 
import f2 

F2.py:

print "World!" 

Cuando se ejecuta:

python ./f1.py 
Hello, 
World! 

Editar para aclarar: la parte que sugerí que era "desordenada" es usar la declaración import solo por el efecto secundario de generar resultados, no la creación de archivos fuente separados.

+0

si pego 'import f2' en un bucle, solo escribe' ¡Mundo! 'una vez. ¿Puedo cambiarlo de alguna manera? – Markus

+0

Pondré la sentencia 'print' (en f2.py) en una función, importo el archivo solo una vez y llamo a su nueva función en el ciclo. –

+0

Pero es allí donde tengo problemas para llamar al código real con las variables necesarias en el código principal y los "sub-códigos" – Markus

Cuestiones relacionadas