10

Working on some code and I'm given the error when running it from the command prompt...

NameError: name 'Popen' is not defined

but I've imported both import os and import sys.

Here's part of the 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]

Am I missing something elementary? I wouldn't doubt it. Thanks!

SilentGhost
  • 307,395
  • 66
  • 306
  • 293
Tyler
  • 3,919
  • 7
  • 27
  • 26
  • specify version of Python. some modules were changed in python-2.6 – van Jun 17 '09 at 15:47
  • 1
    Python 2.5 After saying... process = os.Popen(cmd, stderr=STDOUT, stdout=PIPE) it now gives me the error... NameError: name 'STDOUT' is not defined – Tyler Jun 17 '09 at 15:53
  • After that.. WindowsError: [Error 3] The system cannot find the path specified – Tyler Jun 17 '09 at 18:13
  • this is not a Python issue. does your exepath exist? you need to ask another question to get proper answers re this error (it has nothing to do with your original question), this question has run its course. – SilentGhost Jun 17 '09 at 18:56

6 Answers6

38

you should do:

import subprocess
subprocess.Popen(cmd, stderr=subprocess.STDOUT, stdout=subprocess.PIPE)
# etc.
SilentGhost
  • 307,395
  • 66
  • 306
  • 293
7

Popen is defined in the subprocess module

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

Or:

from subprocess import Popen
Popen(...)
David Cournapeau
  • 78,318
  • 8
  • 63
  • 70
2

When you import a module, the module's members don't become part of the global namespace: you still have to prefix them with modulename.. So, you have to say

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

Alternatively, you can use the from module import names syntax to import things into the global namespace:

from os import popen    # Or, from os import * to import everything
process = popen(command, mode, bufsize)
Adam Rosenfield
  • 390,455
  • 97
  • 512
  • 589
1

If your import looks like this:

import os

Then you need to reference the things included in os like this:

os.popen()

If you dont want to do that, you can change your import to look like this:

from os import *

Which is not recommended because it can lead to namespace ambiguities (things in your code conflicting with things imported elsewhere.) You could also just do:

from os import popen

Which is more explicit and easier to read than from os import *

S.Lott
  • 384,516
  • 81
  • 508
  • 779
Dan Lorenc
  • 5,376
  • 1
  • 23
  • 34
1

This looks like Popen from the subprocess module (python >= 2.4)

from subprocess import Popen
Kjetil Joergensen
  • 1,595
  • 11
  • 10
-2

You should be using os.popen() if you simply import os.

Andrew
  • 1,853
  • 1
  • 14
  • 15