🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.os.linux.programacion
Article #13136

[LARGO] Re: [python] De shell a python

#13136
From: Jesús Carrete Montaña
Date: Sun, 18 Mar 2001 13:11
184 lines
6972 bytes
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

>>>>> "Santiago" == Santiago Romero <sromero@escomposlinux.org> writes:

    Santiago>  Lo que sigue son comandos de ejemplo para pasar a
    Santiago> python:

    Santiago> echo "aeiou" > fichero echo "mas_aeiou" >> fichero

f=open("fichero","r+") #Abrimos el fichero
f.seek(0,2) #Nos colocamos al final
f.write("aeiou") #escribimos
f.write("mas_aeiou") #seguimos escribiendo
f.close() #cerramos el fichero

    Santiago> variable=`grep cadena fichero`

import re #M�dulo de expresiones regulares
#En realidad para buscar una cadena basta el m�dulo string, pero ya
#puestos vamos a buscar una regexp

Regexp=re.compile("^ae{3}i+$")#No es estrictamente necesario compilar,
#pero si acelera bastante el proceso cuando se busca varias veces

f=open("fichero","r") #Abrimos el fichero
Variable=[]
while 1:
        Read=f.readline() #Leemos una l�nea por vez
        if Read=='': break #Si hay un EOF salimso del bucle
        Result=Regexp.search(Read)#Aplicamos la regexp a la l�nea
        if Result==None: continue #Pasamos a la siguiente si no coincide
        Variable.append(Result.group(0)) #Si coincide a�adimos la l�nea
f.close()#cerramos el fichero
#Ahora Variable tendr� el valor de una lista de las l�neas que coincidieron

    Santiago> ficheros=`ls *.c`

import os
Ficheros=os.listdir(".") #Listado del directorio
import re
for Fichero in Ficheros:
        if re.search("^.*?\.c$", Fichero)==None: Ficheros.remove(Fichero)
#Hemos eliminado todos los archivos que no sean .c

    Santiago> for i in `find . -name "*.c"`; do vim $i; done;

import os
Ficheros=os.listdir(".")
import re
for Fichero in Ficheros:
        if re.search("^.*?\.c$", Fichero)==None: Ficheros.remove(Fichero)
#Hasta aqu� como antes
for Fichero in Ficheros:
        os.system("emacs "+Fichero)
#Humm... noto una peque�a diferencia, pero d�nde estar�... XD

Aprovecho para decir que existe vim-python, que permite controlar vim
desde python.

    Santiago> cat fichero.txt | cut -f 2 -d " "

import string
f=open("fichero","r")
while 1:
        Line=f.readline() #podr�amos usar readlines(), pero se puede
        #desbordar la memoria
        if Line='': break
        List=string.split(Line," ")#eparamos los campos
        print List[1] #e imprimimos el que deseemos
f.close()

    Santiago> if [ -t fichero ]; then echo "Fichero existe"; fi

import os.path
if os.path.exists("fichero"): print "Fichero existe"

    Santiago> comando &

import Threading
import os #se pueden importar varios en la misma l�nea, pero no me gusta XD
for Threading import *
NuevoThread=Thread(None,os.system,"NuevoThread",("comando"))
#Llamamos a un nuevo thread para ejecutar el comando

    Santiago> # �tal vez exista argc, como en C, para resolver esta? :

Existe sys.argv, y len(sys.argv) es argc :-).

    Santiago> if test -z "$*"; then echo "Uso: programa argumento1
    Santiago> argumento2"; fi
 
No s� lo que significa eso en bash, pero supongo que algo como:

import sys
if len(sys.argv) != 3:
        print "Uso : "+sys.argv[0]+" argumento1 argumento2"
        sys.exit(1)

    Santiago>  - �C�mo puedo imprimir el valor de una matrix sin hacer
    Santiago> un bucle que la recorra? (como en matlab, tal vez no se
    Santiago> pueda).

Matriz=[1,2,4,5,6]
print Matriz

        �Cu�l es el problema?

    Santiago>  Esto es todo lo que me viene por ahora a la
    Santiago> memoria... :)

        Te habr�s quedado descansado XDD

    Santiago>  El problema es que no s� si debo usar una orden tipo
    Santiago> "exec" para ejecutar el comando de shell, o si existen
    Santiago> ordenes similares en python que me permitan hacer esas
    Santiago> cosas sin darle 2000 vueltas al asunto, si puedo
    Santiago> conseguir que una variable de python valga la salida de
    Santiago> ese comando (ej var=`ls *.c`), etc.

        Tienes todas las opciones. Desde os.system() (igual al
system() de C), pasando por popen() para abrir una pipe, a las
funciones de os y os.path para manejo de archivos. Ya para terminar,
que voy a ganar el premio al mensaje co�azo del mes, te pego un
peque�o ejemplo de script que hice para adecuar los permisos de un
directorio y sus archivos para subirlos a una web:

++++
#!/usr/bin/python

import os
import sys
import os.path

def BajaDir(Directorio):
	try:
		os.chdir(Directorio)
	except OSError:
		print Directorio,"- No se pudo abrir el directorio."
	Lista=os.listdir(Directorio)
	for Fichero in Lista:
		if os.path.isdir(Fichero):
			Lista2=os.listdir(Fichero)
			for Fichero2 in Lista2:
				NombreFichero=Fichero+"/"+Fichero2
				Lista.append(NombreFichero)
	for Fichero in Lista:
		CambiaPermisos(Fichero)

def CambiaPermisos(Fichero):
	if os.path.isdir(Fichero):
		os.chmod(Fichero,0755)
	else:
		os.chmod(Fichero,0644)

if len(sys.argv) < 2:
	print "Debe especificar un directorio."
	sys.exit(1)

BajaDir(sys.argv[1])
++++

Un saludo.

P.D.: No he probado los programas, podr�an contener alg�n error accidental, 
pero deber�a ser trivial. En cualquier caso si no puedes solucionarlo
avisa. Ah, y tambi�n falta control de errores al abrir archivos y tal,
pero si lo pongo el mensaje se eterniza.

P.D2: Te aconsejo un vistacillo a la tutorial y a la library reference que
cuelgan de /usr/doc/python/html/index.html
- -- 
"!Dios aleje de nosotros la serenidad de los ignorantes!
�Dios aparte de nosotros la paz de los cobardes!" (De Gasparin)
Jes�s Carrete Monta�a (Kuantiko) <kuantiko@escomposlinux.org>
LRU #158442 -> I use free software. | PGP Key -> pgp.rediris.es
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.4 (GNU/Linux)
Comment: Processed by Mailcrypt and GnuPG

iD8DBQE6tLPQfUtQQKOnZ1IRAiXKAJ9mGL3K/6tdzivOHcyt/ajtB6h9LgCfXvvQ
aM8kN0yra6ECDBwd3SJLuVY=
=yZWj
-----END PGP SIGNATURE-----
Technical Details
Message-ID: <87u24r43yx.fsf@relativistic.homeip.net>
Path: arc1-ca.pugleaf.net!supernews.google.com!sn-xit-03!supernews.com!logbridge.uoregon.edu!fu-berlin.de!uni-berlin.de!106-coru-x9.libre.retevision.ES!not-for-mail
References: <bl3299.vc.ln@127.0.0.1>

Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII
X-Google-Thread: f86c8,4729121b4927b783
X-Google-Attributes: gidf86c8,public
X-Google-ArrivalTime: 2001-03-18 05:18:02 PST
Path: arc1-ca.pugleaf.net!supernews.google.com!sn-xit-03!supernews.com!logbridge.uoregon.edu!fu-berlin.de!uni-berlin.de!106-coru-x9.libre.retevision.ES!not-for-mail
From: kuantiko@escomposlinux.org (Jesús Carrete
  Montaña)
Newsgroups: es.comp.os.linux.programacion
Subject: [LARGO] Re: [python] De shell a python
Date: 18 Mar 2001 14:11:02 +0100
Lines: 184
Sender: kuantiko@relativistic.homeip.net
Message-ID: <87u24r43yx.fsf@relativistic.homeip.net>
References: <bl3299.vc.ln@127.0.0.1>
NNTP-Posting-Host: 106-coru-x9.libre.retevision.es (62.83.52.106)
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit
X-Trace: fu-berlin.de 984921379 4125081 62.83.52.106 (16 [54696])
User-Agent: Gnus/5.0808 (Gnus v5.8.8) Emacs/20.7