Programmation » [Python] Sourcer un (c)shell
[Python] Sourcer un (c)shell
Publié le 02/09/2010 @ 16:17:53,
Par blietaerTiens?!
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.
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
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.
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 philfrIl te sert à quoi l'environnement dans python ?
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.
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 blietaerAh 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
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 philfrSi 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.
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 blietaerCes 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....
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 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....
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 philfrSinon, tu wrappes ton script python dans un script csh...
#!/bin/csh
source .my.env
python tonscript.py
#!/bin/csh
source .my.env
python tonscript.py
[Python] Sourcer un (c)shell
Publié le 03/09/2010 @ 12:09:36,
Par blietaerEn 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.
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 philfrPour 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
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 blietaerBORDEL?!
Et au besoin s'arrêter.
[Python] Sourcer un (c)shell
Publié le 03/09/2010 @ 13:17:17,
Par philfr
[Python] Sourcer un (c)shell
Publié le 03/09/2010 @ 17:21:01,
Par blietaerDu 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...
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 philfrMets 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...
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 blietaerNon 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.
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.