Programmation » [Python] Sourcer un (c)shell
Catégorie:  
   
[Python] Sourcer un (c)shell
Publié le 02/09/2010 @ 16:17:53,
Par blietaer
Tiens?!

Comment faire, depuis Python, un petit:
~$#> source .my.env
?
En sachant qu'on est en csh et qu'une solution non-acceptable serait de retourner la vapeur et de commencer par sourcer le .my.env et puis lancer le *py.


.my.env
setenv BROL_1 toto
setenv BROL_2 tutu
setenv BROL_3 tata
setenv BROL_4 titi


J'ai tenté des os.system(cmd) mais ca ne prend pas Odile.

>>> os.system("source .my.env")
.my.env: line 1: setenv: command not found
.my.env: line 6: syntax error: unexpected end of file
256


Une autre idée est de jouer avec les subthread, qui semble bien tourner, mais du coup je ne vois pas les BROL_x depuis les os.getenv() :ahbahfatalmen:

Dernière édition: 02/09/2010 @ 16:35:25
Et au besoin s'arrêter.
   
[Python] Sourcer un (c)shell
Publié le 02/09/2010 @ 16:57:30,
Par philfr
Il te sert à quoi l'environnement dans python ? :write:

Tu peux parser le fichier et modifier os.environ:

import os

for line in open(".my.env"):
(drop, name, value)=line.split(None, 2)
os.environ[name]=value


Mais je ne vois pas l'intérêt de modifier l'environnement, puisque les modifs ne sont valables que dans ton process.
   
[Python] Sourcer un (c)shell
Publié le 02/09/2010 @ 17:12:18,
Par blietaer
Ah oui je comprends ton étonnement: j'ai été un peu tendre dans l'exemple que je donne.
Augmentons la difficultée:


.my.env
setenv BROL_1 /path/to/toto
setenv BROL_2 /path/to/`hostname`/tutu
setenv BROL_3 /path/`whoami`/tata
setenv BROL_4 /etc/titi
if (! $?S2K_SRV_FAMILY) then
setenv S2K_SRV_FAMILY PRIME
endif



Donc l'avantage de parser les valeurs comme des variables d'environements (et non pas comme un parsing stupide du fichier) c'est que je récolte la 'traduction' de la variable en cshell.

(ouuuais bon, je _pourrais_ lire la ligne de mon .my.env et _puis_ faire un echo pour la traduire (et d'ailleurs cela marche très bien) mais ce que je n'ai pas dit non plus c'est qu'il y a plusieurs variables et plusieurs .my.env différents (comme dans 'beaucoup') )

Ah oui non bien sûr qu'il n'y a pas de persistence de toutes ces variables une fois le script terminé et d'ailleurs elles se font même violemment écraser d'un .my.env à l'autre...

Dernière édition: 02/09/2010 @ 17:18:43
Et au besoin s'arrêter.
   
[Python] Sourcer un (c)shell
Publié le 02/09/2010 @ 20:04:48,
Par philfr
Si je comprends bien, tu veux lire un fichier de configuration "programmable" pour utiliser le résultat quelque part dans ton programme python.
Et tu veux qu'il soit en csh, mais tu ne veux pas le sourcer depuis csh...

Autre tentative: tu écris ton fichier de config en python ? Et tu peux y utiliser les variables d'environnement existantes ? Et tu peux l'évaluer depuis python.
   
[Python] Sourcer un (c)shell
Publié le 03/09/2010 @ 11:15:50,
Par blietaer
Ces fichiers ne m'appartiennent pas, je suis dans un environement client.
Et ils ne sont pas loadé quand moi je lance mon python, mais lorsque l'utilisateur les loadera, ce sera bien depuis csh. Il ne m'appartient donc pas d'en changer le format.
Le fichier à lire est bien du CSH donc.

Maintenant, je pense que le plus simple serait de repérer la/les ligne(s) qui me botte dans ces fichiers et d'en faire une évaluation par un echo dans un appel system CSH, mais:
- j'aurais voulu éviter du parsing de fichier
- si justement la valeur à évaluer contient d'autres valeurs de variables de ce même fichier, je vais passer à côté.

grrr.... :angry:

Kim: Très exactement ma question:
http://www.linuxquestions.org/questions/programming-9/source-bash-variables-into-python-environ-551956/
(et donc très exactement la réponse que je ne voulais pas entendre...)

Dernière édition: 03/09/2010 @ 11:39:32
Et au besoin s'arrêter.
   
[Python] Sourcer un (c)shell
Publié le 03/09/2010 @ 11:56:26,
Par philfr
Sinon, tu wrappes ton script python dans un script csh...


#!/bin/csh
source .my.env
python tonscript.py
   
[Python] Sourcer un (c)shell
Publié le 03/09/2010 @ 12:09:36,
Par blietaer

En sachant qu'on est en csh et qu'une solution non-acceptable serait de retourner la vapeur et de commencer par sourcer le .my.env et puis lancer le *py.

:sweat:

Cela dit si toi-même tu en arrives à me proposer cela, je me situe mieux par rapport à mon problème. Donc merci beaucoup pour ton temps (quand-même!)
Et au besoin s'arrêter.
   
[Python] Sourcer un (c)shell
Publié le 03/09/2010 @ 12:41:43,
Par philfr
Pour parser du csh, rien ne vaut csh.

parse.csh:

#!/bin/csh
source $1
printenv


Si tu exécutes "parse.csh .my.env", le stdout te crache tout l'environnement modifié par le .my.env.

Y'a plus qu'à lancer ça depuis python et récupérer le stdout:

output= subprocess.Popen(["/home/philfr/parse.csh","my.env"], stdout=subprocess.PIPE).communicate()[0]
for line in output.split('\n'):
print line
   
[Python] Sourcer un (c)shell
Publié le 03/09/2010 @ 12:43:10,
Par blietaer
BORDEL?!
Et au besoin s'arrêter.
   
[Python] Sourcer un (c)shell
Publié le 03/09/2010 @ 13:17:17,
Par philfr



Ton PC a explosé ? :grin:
   
[Python] Sourcer un (c)shell
Publié le 03/09/2010 @ 17:21:01,
Par blietaer
Du tout, c'est une solution super classe en théorie.

Je dois encore juste peaufiner, je me tape tjrs la même erreur avec subprocess...

Python 2.6.2 (r262:71600, Jun 17 2010, 13:37:18)
[GCC 4.4.1 [gcc-4_4-branch revision 150839]] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> output = subprocess.Popen(["./parser.sh", "/home/bli/s2k.env"], stdout=subprocess.PIPE).communicate() [0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.6/subprocess.py", line 605, in __init__
errread, errwrite)
File "/usr/lib/python2.6/subprocess.py", line 1102, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
>>>

Inutile de préciser que les deux fichiers en question existent bien...

Et au besoin s'arrêter.
   
[Python] Sourcer un (c)shell
Publié le 03/09/2010 @ 18:22:01,
Par philfr
Mets le path complet (pas relatif) vers to script.

Ou bien, pour ne pas avoir besoin de parser.sh:

output = subprocess.Popen(["/bin/csh", "-c", "source $1 ; setenv", "/home/bli/s2k.env"], stdout=subprocess.PIPE).communicate() [0]

Avec toujours le path complet vers l'exécutable...
   
[Python] Sourcer un (c)shell
Publié le 06/09/2010 @ 12:03:20,
Par blietaer
Non seulement ta solution est séduisante mais aussi flexible, compacte et puissante.

Certains de ces compliments sont sans doute (aussi) à attribuer au langage, mais merci pour ton temps et tes recherches.
Et au besoin s'arrêter.
Répondre - Catégorie:  
Informaticien.be - © 2002-2024 AkretioSPRL  - Generated via Kelare
The Akretio Network: Akretio - Freedelity - KelCommerce - Votre publicité sur informaticien.be ?