2009-06-17 8 views
5

travail sur un code et je suis donné l'erreur lors de l'exécuter à partir de l'invite de commande ...Popen et python

NameError: name 'Popen' is not defined 

mais je l'ai importé à la fois import os et import sys.

Voilà une partie du code

exepath = os.path.join(EXE File location is here) 
exepath = '"' + os.path.normpath(exepath) + '"' 
cmd = [exepath, '-el', str(el), '-n', str(z)] 

print 'The python program is running this command:' 
print cmd 

process = Popen(cmd, stderr=STDOUT, stdout=PIPE) 
outputstring = process.communicate()[0] 

Suis-je manque quelque chose élémentaire? Je n'en douterais pas. Merci!

+0

Spécifiez la version de Python. certains modules ont été modifiés en python-2.6 – van

+1

Python 2.5 Après avoir dit ... processus = os.popen (cmd, stderr = STDOUT, stdout = PIPE) il me donne maintenant l'erreur ... NameError: le nom 'STDOUT' n'est pas défini – Tyler

+0

@Tyler: relisez ma réponse – SilentGhost

Répondre

30

vous devez faire:

import subprocess 
subprocess.Popen(cmd, stderr=subprocess.STDOUT, stdout=subprocess.PIPE) 
# etc. 
+0

Après cela .. WindowsError: [Erreur 3] Le système ne peut pas trouver le chemin spécifié – Tyler

-1

Vous devriez utiliser os.popen() si vous devez simplement importer un os.

+0

J'ai également importé un sous-processus si cela aide à clarifier quoi que ce soit – Tyler

+0

Vous appelez "Popen()" alors qu'en fait vous devriez utiliser "os.popen()" –

7

Popen est défini dans le module subprocess

import subprocess 
... 
subprocess.Popen(...) 

Ou:

from subprocess import Popen 
Popen(...) 
+0

depuis le sous-processus import Popen; Popen (...) – van

+0

Après avoir dit ... processus = os.popen (cmd, stderr = STDOUT, stdout = PIPE) il me donne maintenant l'erreur ... NameError: nom 'STDOUT' n'est pas défini – Tyler

+0

processus = subprocess.Popen (cmd, stderr = sous-processus.STDOUT, stdout = subprocess.PIPE) –

1

Si votre importation ressemble à ceci:

import os 

Ensuite, vous devez référencer les choses incluses dans os comme ceci:

os.popen() 

Si vous ne voulez pas le faire, vous pouvez modifier votre importation pour ressembler à ceci:

from os import * 

Ce qui n'est pas recommandée car elle peut conduire à des ambiguïtés d'espace de noms (choses dans votre code en conflit avec les choses importées . ailleurs) vous pouvez aussi simplement faire:

from os import popen 

Ce qui est plus explicite et plus facile à lire que d'os import *

2

Lorsque vous importez un module, e Les membres du module ne font pas partie de l'espace de noms global: vous devez toujours les préfixer avec modulename.. Donc, vous avez à dire

import os 
process = os.popen(command, mode, bufsize) 

Vous pouvez également utiliser la syntaxe from module import names importer des choses dans l'espace de noms global:

from os import popen # Or, from os import * to import everything 
process = popen(command, mode, bufsize) 
1

Cela ressemble Popen du module subprocess (python> = 2.4)

from subprocess import Popen