Utiliser os.system() et os.path

Utiliser os.system() et os.path - Python - Programmation

Marsh Posté le 26-10-2008 à 14:19:56    

Kikoo,
 
J'ai réussi à faire ce que je voulais mais je pense qu'il y a moyen de faire plus proprement. Voici ma méthode pour exécuter un script python se trouvant dans le fichier c:\Python25\xml:

Code :
  1. os.system(os.path.join(os.getcwd(),'xml\\xmlTopic.py'))


Si je met ce même script dans c:\Python25 et que je fais

Code :
  1. os.system('xmlTopic.py')


ça marche aussi. Je supposais que c'est dû au fait que le répertoire c:\Python25 se trouve dans la variable sys.path, j'ai donc essayé ce code-ci:

Code :
  1. sys.path.append(os.path.join(os.getcwd(),'xml'))
  2. os.system('xmlTopic.py')


qui ajoute dans un premier le fichier c:\Python25\xml à la variable sys.path. Mais l'appel os.system() me renvoie "'xmlTopic.py' is not recognized as an internal or external command,
operable program or batch file."
 
Est-il possible de jouer avec la variable sys.path ou doit-on faire comme je fais?
 
Merci!!

Reply

Marsh Posté le 26-10-2008 à 14:19:56   

Reply

Marsh Posté le 26-10-2008 à 14:53:02    

tu essayes de faire quoi là ? :heink:


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 26-10-2008 à 15:51:29    

J'essaie d'exécuter le script xmlTopic.py se trouvant dans le dossier c:\Python25\xml depuis le dossier c:\Python25.

Code :
  1. os.system(os.path.join(os.getcwd(),'xml\\xmlTopic.py'))


Là je crée donc le chemin jusqu'au fichier c:\Python25\xml\xmlTopic.py et je l'exécute avec l'os.system().
 
Mais j'aimerais faire en sorte de pouvoir importer ou exécuter des fichiers sans devoir passer le chemin absolu, en utilisant donc sys.path mais ça n'a pas l'air de fonctionner.

Reply

Marsh Posté le 26-10-2008 à 16:10:30    

Je viens de tester un truc qui marche aussi:
 

Code :
  1. os.system('xml\\xmlTopic.py')


 
Mais le but ce serait de faire carrément:
 

Code :
  1. os.system('xmlTopic.py')


 
Sans que cela bug.

Reply

Marsh Posté le 26-10-2008 à 16:13:22    

[:prozac]  [:prozac]  [:prozac]  [:prozac]  [:prozac]

 

edit: sys.path n'a aucun rapport avec le PATH windows, faudrait peut-être lire la doc de temps en temps, c'est le path d'import des modules Python [:pingouino]

 

Et ya quoi dans ton xmlTopic.py, pourquoi il est dans c:\Python25 alors qu'il n'a rien à y foutre, et pourquoi tu veux le lancer en shell plutôt que l'importer [:petrus dei]


Message édité par masklinn le 26-10-2008 à 16:15:12

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 26-10-2008 à 18:00:18    

Au départ, j'avais fait un parallèle entre les modules python et les script python (je veux dire, je pensais que le path menait tant aux modules à importer qu'à des fichiers à ouvrir ou à des scripts à lancer). J'ai lu la doc mais elle est pas super précise (elle parle que des modules, mais ne mentionne pas de restriction au sujet des autres élément mentionnées ci-dessus).
 
Sinon, les élément se trouvent pour le moment dans Python25 car ils sont encore en phase de test (après ils seront déplacés à gogo) et que le Python25 est facilement atteignable avec la console.
 
En réalité, j'ai 6-7 scripts et je les lance depuis un script lanceur. Ainsi, un utilisateur lance le script lanceur et tous les script suivent.
 
J'ai par contre essayer d'importer des fichier python contenant des fonction et des classes en ajoutant le chemin du dossier contenant ces fichiers dans le sys.path mais ça ne marche pas non plus. Il me fait 'ImportError: No module named exprReg'. Voici le code:

Code :
  1. sys.path.append(os.path.join(os.getcwd().rpartition('\\')[0],'lib'))
  2. from exprReg import ExprReg
  3. from eltSpec import EltSpec
  4. from xmlFct import extDonnees


 
Le append ajoute bien le fichier lib dans lequel sont contenus les modules. Si met tous les fichiers dans le même dossier, les commandes import fonctionnent bien.

Message cité 1 fois
Message édité par Shadew le 26-10-2008 à 18:09:06
Reply

Marsh Posté le 26-10-2008 à 19:39:15    

Shadew a écrit :

Au départ, j'avais fait un parallèle entre les modules python et les script python (je veux dire, je pensais que le path menait tant aux modules à importer qu'à des fichiers à ouvrir ou à des scripts à lancer). J'ai lu la doc mais elle est pas super précise (elle parle que des modules, mais ne mentionne pas de restriction au sujet des autres élément mentionnées ci-dessus).
 
Sinon, les élément se trouvent pour le moment dans Python25 car ils sont encore en phase de test (après ils seront déplacés à gogo) et que le Python25 est facilement atteignable avec la console.
 
En réalité, j'ai 6-7 scripts et je les lance depuis un script lanceur. Ainsi, un utilisateur lance le script lanceur et tous les script suivent.
 
J'ai par contre essayer d'importer des fichier python contenant des fonction et des classes en ajoutant le chemin du dossier contenant ces fichiers dans le sys.path mais ça ne marche pas non plus. Il me fait 'ImportError: No module named exprReg'. Voici le code:

Code :
  1. sys.path.append(os.path.join(os.getcwd().rpartition('\\')[0],'lib'))
  2. from exprReg import ExprReg
  3. from eltSpec import EltSpec
  4. from xmlFct import extDonnees


 
Le append ajoute bien le fichier lib dans lequel sont contenus les modules. Si met tous les fichiers dans le même dossier, les commandes import fonctionnent bien.


Mais qu'est-ce que c'est que cette horreur [:mlc]
 
La première règle de sys.path, c'est qu'on ne touche jamais à sys.path.
 
Ensuite, prière de poster ton arbo de modules parce que là tu colles des bouts de code sans qu'il soit possible de savoir de quoi tu parles (et dégages le tout de python25, ça n'a rien à y faire)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 27-10-2008 à 08:36:38    

J'avais trouvé sur le net qu'il fallait bidouiller sys.path pour inclure des modules, c'est pour ça que j'ai fait un append.
 
Voici l'arbo:
C:\Python25\Extracteurv2\xml\config : contient les script genre xmlTopic.py qui doivent appeler les modules
C:\Python25\Extracteurv2\xml\lib : contient les modules genre ExprReg.

Reply

Marsh Posté le 27-10-2008 à 10:54:12    

Shadew a écrit :

J'avais trouvé sur le net qu'il fallait bidouiller sys.path pour inclure des modules, c'est pour ça que j'ai fait un append.
 
Voici l'arbo:
C:\Python25\Extracteurv2\xml\config : contient les script genre xmlTopic.py qui doivent appeler les modules
C:\Python25\Extracteurv2\xml\lib : contient les modules genre ExprReg.


$ mkdir xml
$ cd xml
$ mkdir config
$ mkdir lib
$ touch __init__.py
$ touch config/__init__.py
$ touch lib/__init__.py
$ cat > config/xmltopic.py
def run():
        print "Running xmltopic"
 
if __name__ == "__main__":
        run()
^C
$ cat > config/xmlmodule.py
from xml.lib.exprreg import ExprReg
 
def run():
        print ExprReg()
 
if __name__ == "__main__":
        run()
^C
$ cat > lib/exprreg.py
class ExprReg(object):
        def __str__(self):
                return "ExprReg object"
^C
$ cd ..
$ cat > app.py
#!/usr/bin/env python
 
from xml.config import xmltopic, xmlmodule
 
xmltopic.run()
xmlmodule.run()
^C
$ python app.py
Running xmltopic
ExprReg object
$ tree /F /A .
EXTRACTEURV2
|   app.py
|
\---xml
    |   __init__.py
    |
    +---config
    |       xmlmodule.py
    |       xmltopic.py
    |       __init__.py
    |
    \---lib
            exprreg.py
            __init__.py


[:spamafote]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 27-10-2008 à 16:34:05    

Merci!! Donc en fait il suffit de rajouter des fichiers __init__.py pour pouvoir importer des modules. Et comment faire pour importer le module se trouvant dans lib depuis le script se trouvant dans config? Il faudrait réussir à revenir en arrière d'un fichier et puis importer lib. C'est possible ou bien il faut s'arranger que les fichiers respecte ton arborescence?

Message cité 1 fois
Message édité par Shadew le 27-10-2008 à 16:34:19
Reply

Marsh Posté le 27-10-2008 à 16:34:05   

Reply

Marsh Posté le 27-10-2008 à 16:41:42    

Shadew a écrit :

Merci!! Donc en fait il suffit de rajouter des fichiers __init__.py pour pouvoir importer des modules.


Plus précisément, le fichier __init__.py transforme le répertoire dans lequel il est contenu en module python. Qui peut contenir des sous-modules si besoin.

Shadew a écrit :

Et comment faire pour importer le module se trouvant dans lib depuis le script se trouvant dans config? Il faudrait réussir à revenir en arrière d'un fichier et puis importer lib.


C'est possible à partir de Python 2.6 (ou 2.5 en important depuis __future__) en utilisant les Absolute/Relative imports, mais sans ça il faut faire référence à la racine de l'arbo, il n'est (à ma connaissance) pas possible de "remonter". C'est pourquoi dans xml.config.xmlmodule j'importe xml.lib.exprreg (le chemin d'import à partir de app, donc)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 27-10-2008 à 16:48:17    

oki merci pour tout !!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed