don't understand popen2

Discussion in 'Python' started by Martin P. Hellwig, Mar 23, 2006.

  1. Hi all,

    I was doing some popen2 tests so that I'm more comfortable using it.
    I wrote a little python script to help me test that (testia.py):

    ---------------------------------
    someline = raw_input("something:")

    if someline == 'test':
    print("yup")
    else:
    print("nope")
    ---------------------------------

    And another little thing that does it's popen2 stuff:

    ---------------------------------
    import popen2

    std_out, std_in = popen2.popen2("testia.py")

    x=std_out.readline()
    print(x)

    std_in.writelines("notgood")

    x=std_out.readline()
    print(x)
    ---------------------------------

    Now what I expected was that I got the return one the first line:
    "something:" and on the second "nope", but instead of that I got:

    >>>

    something:
    Traceback (most recent call last):
    File "F:\coding\pwSync\popen_test\popen_test.py", line 8, in ?
    std_in.writelines("notgood")
    IOError: [Errno 22] Invalid argument
    >>>


    I played around a bit with flush, write and the order of first writing
    and then reading, the best I can get is no error but still not the
    expected output. I googled a bit copied some examples that also worked
    on my machine, reread the manual and the only conclusion I have is that
    I don't even understand what I'm doing wrong.

    Would you please be so kind to explain my wrong doing?
    (python 2.4 + win32 extensions on XPProSP2)

    Thanks in advance!

    --
    mph
     
    Martin P. Hellwig, Mar 23, 2006
    #1
    1. Advertising

  2. Martin P. Hellwig

    Guest

    Martin P. Hellwig wrote:
    > Hi all,
    >
    > I was doing some popen2 tests so that I'm more comfortable using it.
    > I wrote a little python script to help me test that (testia.py):
    >
    > ---------------------------------
    > someline = raw_input("something:")
    >
    > if someline == 'test':
    > print("yup")
    > else:
    > print("nope")
    > ---------------------------------
    >
    > And another little thing that does it's popen2 stuff:
    >
    > ---------------------------------
    > import popen2
    >
    > std_out, std_in = popen2.popen2("testia.py")
    >
    > x=std_out.readline()
    > print(x)
    >
    > std_in.writelines("notgood")
    >
    > x=std_out.readline()
    > print(x)
    > ---------------------------------
    >
    > Now what I expected was that I got the return one the first line:
    > "something:" and on the second "nope", but instead of that I got:
    >
    > >>>

    > something:
    > Traceback (most recent call last):
    > File "F:\coding\pwSync\popen_test\popen_test.py", line 8, in ?
    > std_in.writelines("notgood")
    > IOError: [Errno 22] Invalid argument
    > >>>

    >
    > I played around a bit with flush, write and the order of first writing
    > and then reading, the best I can get is no error but still not the
    > expected output. I googled a bit copied some examples that also worked
    > on my machine, reread the manual and the only conclusion I have is that
    > I don't even understand what I'm doing wrong.
    >
    > Would you please be so kind to explain my wrong doing?
    > (python 2.4 + win32 extensions on XPProSP2)


    >>> help(sys.stdin.writelines)

    Help on built-in function writelines:

    writelines(...)
    writelines(sequence_of_strings) -> None. Write the strings to the
    file.

    Note that newlines are not added. The sequence can be any iterable
    object
    producing strings. This is equivalent to calling write() for each
    string>

    You gave it a single string, not a list(sequence) of strings. Try
    something like:
    std_in.writelines(["notgood"])
     
    , Mar 23, 2006
    #2
    1. Advertising

  3. Martin P. Hellwig

    Donn Cave Guest

    Quoth :
    | Martin P. Hellwig wrote:
    ....
    |> import popen2
    |>
    |> std_out, std_in = popen2.popen2("testia.py")
    |>
    |> x=std_out.readline()
    |> print(x)
    |>
    |> std_in.writelines("notgood")
    |>
    |> x=std_out.readline()
    |> print(x)
    ....
    |> Traceback (most recent call last):
    |> File "F:\coding\pwSync\popen_test\popen_test.py", line 8, in ?
    |> std_in.writelines("notgood")
    |> IOError: [Errno 22] Invalid argument
    |> >>>
    ....

    | You gave it a single string, not a list(sequence) of strings. Try
    | something like:
    | std_in.writelines(["notgood"])

    Did you try it? For me, writelines(string) works fine. Since in
    Python, a string is in a sense a sequence of strings, this doesn't
    even really contradict the documentation -

    | ... The sequence can be any iterable object producing strings.

    Anyway, it seems unlikely he would get that INVARG error for this
    reason. That's an error from the host operating system, not the
    interpreter, and it mostly likely refers to the file descriptor.
    Since it works for me, I guess his problem is basically this:

    |> (python 2.4 + win32 extensions on XPProSP2)

    Donn Cave,
     
    Donn Cave, Mar 23, 2006
    #3
  4. wrote:
    <cut>
    >
    > You gave it a single string, not a list(sequence) of strings. Try
    > something like:
    > std_in.writelines(["notgood"])
    >


    I got this output then:
    >>>

    something:
    Traceback (most recent call last):
    File "F:\coding\pwSync\popen_test\popen_test.py", line 8, in ?
    std_in.writelines(["notgood"])
    IOError: [Errno 22] Invalid argument
    >>>

    something:
    Traceback (most recent call last):
    File "F:\coding\pwSync\popen_test\popen_test.py", line 8, in ?
    std_in.write("notgood")
    IOError: [Errno 22] Invalid argument
    >>>


    It seems that it doesn't matter.

    --
    mph
     
    Martin P. Hellwig, Mar 23, 2006
    #4
  5. Donn Cave wrote:
    <cut>
    >
    > Anyway, it seems unlikely he would get that INVARG error for this
    > reason. That's an error from the host operating system, not the
    > interpreter, and it mostly likely refers to the file descriptor.
    > Since it works for me, I guess his problem is basically this:
    >
    > |> (python 2.4 + win32 extensions on XPProSP2)
    >
    > Donn Cave,


    Thank you for your suggestion.

    I shuffled it a bit around and executed it on my BSD box and there
    indeed it works, if I use that exactly program (well not the path var of
    course) on NT it has no error but it still not gives the expected
    results. So I guess that pipes,std-in, std-out & std-err work that
    different on NT then on other POSIX systems.

    The lucky thing is that the code where I am exercising for must run on a
    BSD system so my immediately problem is dealt with, but I'm still
    curious how to get this working on NT.

    I posted my new code and the results under my sep.

    --
    mph

    popen_test.py------------------------------------
    #! /usr/local/bin/python
    import popen2

    std_out, std_in = popen2.popen2("F:\coding\pwSync\popen_test\testia.py")
    std_in.writelines("test\n")
    std_in.flush()
    std_in.close()
    x=std_out.readlines()
    print(x)
    -------------------------------------------------

    testia.py----------------------------------------
    #! /usr/local/bin/python
    someline = raw_input("something:")

    if someline == 'test':
    print("yup")
    else:
    print("nope")
    -------------------------------------------------


    results on NT:
    F:\coding\pwSync\popen_test>popen_test.py
    []


    results on BSD:
    %./popen_test.py
    ['something:yup\n']
    %
     
    Martin P. Hellwig, Mar 23, 2006
    #5
  6. Martin P. Hellwig <> wrote:
    >std_out, std_in = popen2.popen2("F:\coding\pwSync\popen_test\testia.py")

    ^^
    Your problem is, I suspect, nothing to do with popen2(), which is
    supported by the fact that the only thing other than OS different
    between this and your working BSD version is the path:
    >>> "F:\coding\pwSync\popen_test\testia.py"

    'F:\\coding\\pwSync\\popen_test\testia.py'

    Try:
    std_out, std_in = popen2.popen2("F:/coding/pwSync/popen_test/testia.py")
    or:
    std_out, std_in = popen2.popen2("F:\\coding\\pwSync\\popen_test\\testia.py")
    (and please avoid the abuse of raw strings for Windows paths).

    --
    \S -- -- http://www.chaos.org.uk/~sion/
    ___ | "Frankly I have no feelings towards penguins one way or the other"
    \X/ | -- Arthur C. Clarke
    her nu becomeþ se bera eadward ofdun hlæddre heafdes bæce bump bump bump
     
    Sion Arrowsmith, Mar 23, 2006
    #6
  7. Sion Arrowsmith wrote:

    >>>> "F:\coding\pwSync\popen_test\testia.py"

    > 'F:\\coding\\pwSync\\popen_test\testia.py'


    this might make it more obvious that something's not quite right with that
    string literal:

    >>> print "F:\coding\pwSync\popen_test\testia.py"

    F:\coding\pwSync\popen_test estia.py

    </F>
     
    Fredrik Lundh, Mar 23, 2006
    #7
  8. Martin P. Hellwig

    Kent Johnson Guest

    Sion Arrowsmith wrote:
    > Try:
    > std_out, std_in = popen2.popen2("F:/coding/pwSync/popen_test/testia.py")
    > or:
    > std_out, std_in = popen2.popen2("F:\\coding\\pwSync\\popen_test\\testia.py")
    > (and please avoid the abuse of raw strings for Windows paths).


    Why do you consider that abuse of raw strings? It's very easy and
    convenient to copy a path from Windows Explorer and paste it directly
    into a raw string, no editing required.

    Kent
     
    Kent Johnson, Mar 23, 2006
    #8
  9. Kent Johnson <> wrote:
    >Sion Arrowsmith wrote:
    >> (and please avoid the abuse of raw strings for Windows paths).

    >Why do you consider that abuse of raw strings?


    I consider it abuse because it's not what they were invented for.
    I consider discouraging it to be a good thing in order to reduce
    the chances of people being bitten by, for instance:

    >>> os.listdir(r"C:\")

    File "<stdin>", line 1
    os.listdir(r"C:\")
    ^
    SyntaxError: EOL while scanning single-quoted string

    and getting all confused on this group.

    --
    \S -- -- http://www.chaos.org.uk/~sion/
    ___ | "Frankly I have no feelings towards penguins one way or the other"
    \X/ | -- Arthur C. Clarke
    her nu becomeþ se bera eadward ofdun hlæddre heafdes bæce bump bump bump
     
    Sion Arrowsmith, Mar 24, 2006
    #9
  10. Martin P. Hellwig

    Kent Johnson Guest

    Sion Arrowsmith wrote:
    > Kent Johnson <> wrote:
    >
    >>Sion Arrowsmith wrote:
    >>
    >>>(and please avoid the abuse of raw strings for Windows paths).

    >>
    >>Why do you consider that abuse of raw strings?

    >
    > I consider it abuse because it's not what they were invented for.
    > I consider discouraging it to be a good thing in order to reduce
    > the chances of people being bitten by, for instance:
    >
    >>>>os.listdir(r"C:\")

    >
    > File "<stdin>", line 1
    > os.listdir(r"C:\")
    > ^
    > SyntaxError: EOL while scanning single-quoted string
    >
    > and getting all confused on this group.


    Judging from the traffic here, people are far more often bitten by *not*
    using raw strings for paths containing \ than they are by using them for
    paths ending with \. So perhaps we should encourage raw strings for
    Windows paths. ;)

    Kent
     
    Kent Johnson, Mar 25, 2006
    #10
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Guy

    popen2

    Guy, Aug 12, 2003, in forum: Python
    Replies:
    1
    Views:
    2,846
    Donn Cave
    Aug 12, 2003
  2. cherico

    popen2 with large input

    cherico, Jan 29, 2004, in forum: Python
    Replies:
    2
    Views:
    325
    Jeff Epler
    Jan 29, 2004
  3. Diez B. Roggisch

    popen2 trouble

    Diez B. Roggisch, Apr 2, 2004, in forum: Python
    Replies:
    2
    Views:
    320
    Diez B. Roggisch
    Apr 5, 2004
  4. A. Lloyd Flanagan

    Possible problem with popen2 module

    A. Lloyd Flanagan, Apr 30, 2004, in forum: Python
    Replies:
    2
    Views:
    315
    A. Lloyd Flanagan
    May 3, 2004
  5. Guest
    Replies:
    1
    Views:
    479
    Donn Cave
    Jun 15, 2004
Loading...

Share This Page