2009-06-17 1 views
5

Lavorare su un codice e sono dato l'errore durante l'esecuzione dal prompt dei comandi ...Popen e pitone

NameError: name 'Popen' is not defined 

ma ho importato sia import os e import sys.

Ecco parte del codice

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] 

mi sto perdendo qualcosa elementari? Non ne dubiterei. Grazie!

+0

specifica la versione di Python. alcuni moduli sono stati cambiati in python-2.6 – van

+1

Python 2.5 Dopo aver detto ... processo = os.popen (cmd, stderr = STDOUT, stdout = PIPE) ora mi dà l'errore ... NameError: nome 'STDOUT' non è definito – Tyler

+0

@Tyler: rileggere la mia risposta – SilentGhost

risposta

30

si dovrebbe fare:

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

Dopodiché ... WindowsError: [Errore 3] Il sistema non riesce a trovare il percorso specificato – Tyler

-1

Si dovrebbe utilizzare os.popen() se si importa semplicemente os.

+0

Ho anche importato un sottoprocesso se questo aiuta a chiarire qualsiasi cosa – Tyler

+0

Stai richiamando "Popen()" quando in realtà dovresti usare "os.popen()" –

7

Popen è definita nel modulo sottoprocesso

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

Oppure:

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

dal sottoprocesso di importazione Popen; Popen (...) – van

+0

Dopo aver detto ... processo = os.popen (cmd, stderr = STDOUT, stdout = PIPE) ora mi dà l'errore ... NameError: nome 'STDOUT' non è definito – Tyler

+0

process = subprocess.Popen (cmd, stderr = subprocess.STDOUT, stdout = subprocess.PIPE) –

1

Se l'importazione si presenta così:

import os 

allora avete bisogno di fare riferimento alle cose incluse nel os in questo modo:

os.popen() 

Se non volete farlo, è possibile modificare l'importazione di simile a questa:

from os import * 

che non è raccomandato perché può portare ad ambiguità dello spazio dei nomi (le cose nel codice in conflitto con le cose importati . altrove) si potrebbe anche solo fare:

from os import popen 

che è più esplicito e più facile da leggere che da os import *

2

Quando si importa un modulo, th I membri del modulo non diventano parte dello spazio dei nomi globale: devi ancora prefissarli con modulename.. Quindi, che hai da dire

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

In alternativa, è possibile utilizzare la sintassi from module import names di importare le cose nel namespace globale:

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

Questo appare come Popen dal modulo sottoprocesso (Python> = 2.4)

from subprocess import Popen