Why is pexpect acting funny with sendline() and expect()?

2012-12-26 Thread saqib . ali . 75
I am running Solaris 5-10, python 2.6.2 and pexpect 2.4

I have the very simple python script below which exercises the functionality of 
sending and receiving text from the shell.

My understanding is that pexepect([pexpect.TIMEOUT, x,y,z], timeout=w) will 
return the index of the match that it found *since the last time pexpect was 
called*, but if it takes longer than w seconds, it will return 0.


Here is my very simple script:


#!/usr/bin/env python

import pexpect
myPrompt =  % 

myShell = pexpect.spawn(/bin/tcsh)
print Sending 'JUNK-0' to shell
x = myShell.sendline(JUNK-0)
y = myShell.expect([pexpect.TIMEOUT], timeout=1)   
print y = %s % y
print myShell.before 
print = * 80
print \n\n
 
for i in range(2):
print i = %d % (i+1)
print Sending 'JUNK-%d' to shell % (i+1)
x = myShell.sendline(JUNK-%d % (i+1))
y = myShell.expect([pexpect.TIMEOUT, myPrompt], timeout=10)  
print y = %s % y
print myShell.before
print = * 80
print \n\n



FYI, my shell prompt is myMachine % , however in this script I have simply 
used  %  to keep it generic.

When I run it, I see the following output: 




Sending 'JUNK-0' to shell
y = 0
JUNK-0
myMachine % JUNK-0
JUNK-0: Command not found.
myMachine % 




i = 1
Sending 'JUNK-1' to shell
y = 1
JUNK-0
myMachine 




i = 2
Sending 'JUNK-2' to shell
y = 1
JUNK-0
JUNK-0: Command not found.
myMachine 





Why do I see JUNK-0 consistently recurring in the output? It should be 
consumed by the first myShell.expect() statement, but it keeps showing up. Why??
-- 
http://mail.python.org/mailman/listinfo/python-list


Why does os.stat() tell me that my file-group has no members?

2012-12-19 Thread saqib . ali . 75


I'm using python 2.6.4 on Solaris 5-10.

I have a file named myFile. It is owned by someone else, by I (myuser) am 
in the file's group (mygrp). Below is my python code. Why does it tell me 
that mygrp has no members???


 import os, pwd, grp
 stat_info = os.stat(myFile)
 fileUID = stat_info.st_uid
 fileGID = stat_info.st_gid
 fileGroup = grp.getgrgid(fileGID)[0]
 fileUser = pwd.getpwuid(fileUID)[0]
 print grp.getgrgid(fileGID) = %s % grp.getgrgid(fileGID)

grp.getgrgid(fileGID) = grp.struct_group(gr_name='mygrp', gr_passwd='', 
gr_gid=100, gr_mem=[])
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Why does os.stat() tell me that my file-group has no members?

2012-12-19 Thread saqib . ali . 75

Thanks!! This was very helpful. It worked perfectly.
I had no clue about the intricacies of how python represents the group data 
from the underlying OS.

This page doesn't go into to detailed explanation like you did: 
http://docs.python.org/2/library/grp.html



On Wednesday, December 19, 2012 6:17:16 PM UTC-5, Hans Mulder wrote:
 On 19/12/12 22:40:00, saqib.ali...@gmail.com wrote:
 
  
 
  
 
  I'm using python 2.6.4 on Solaris 5-10.
 
  
 
  I have a file named myFile. It is owned by someone else, by
 
  I (myuser) am in the file's group (mygrp). Below is my python
 
  code. Why does it tell me that mygrp has no members???
 
  
 
  
 
  import os, pwd, grp
 
  stat_info = os.stat(myFile)
 
  fileUID = stat_info.st_uid
 
  fileGID = stat_info.st_gid
 
  fileGroup = grp.getgrgid(fileGID)[0]
 
  fileUser = pwd.getpwuid(fileUID)[0]
 
  print grp.getgrgid(fileGID) = %s % grp.getgrgid(fileGID)
 
  
 
  grp.getgrgid(fileGID) = grp.struct_group(gr_name='mygrp', gr_passwd='', 
  gr_gid=100, gr_mem=[])
 
 
 
 It doesn't say that your group has no members.
 
 
 
 Every account has a primary group, and some accounts also
 
 have addtional groups.  The primary group is the one in the
 
 .pw_gid attribute in the pwd entry.  The additional groups
 
 are those that mention the account in the .gr_mem attribute
 
 in their grp entry.
 
 
 
 Your experiment shows that nobody has mygrp as an additional
 
 group.  So if you're a member of mygrp, then it must be your
 
 primary group, i.e. os.getgid() should return 100 for you.
 
 
 
 You can get a complete list of members of group by adding
 
 two lists:
 
 
 
 def all_members(gid):
 
 primary_members = [ user.pw_name
 
 for user in pwd.getpwall() if user.pw_gid == gid ]
 
 additional_members = grp.getgrgid(gid).gr_mem
 
 return primary_members + additional_members
 
 
 
 
 
 Hope this helps,
 
 
 
 -- HansM
-- 
http://mail.python.org/mailman/listinfo/python-list


Problem while doing a cat on a tabbed file with pexpect

2012-01-15 Thread Saqib Ali

I am using Solaris 10, python 2.6.2, pexpect 2.4

I create a file called me.txt which contains the letters A, B, C
on the same line separated by tabs.

My shell prompt is % 

I then do the following in the python shell:


 import pexpect
 x = pexpect.spawn(/bin/tcsh)
 x.sendline(cat me.txt)
11
 x.expect([pexpect.TIMEOUT, % ])
1
 x.before
'cat me.txt\r\r\nA   B   C\r\n'
 x.before.split(\t)
['cat me.txt\r\r\nA   B   C\r\n']



Now, clearly the file contains tabs. But when I cat it through expect,
and collect cat's output, those tabs have been converted to spaces.
But I need the tabs!

Can anyone explain this phenomenon or suggest how I can fix it?
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Problem while doing a cat on a tabbed file with pexpect

2012-01-15 Thread Saqib Ali

Very good question. Let me explain why I'm not opening me.txt directly
in python with open.

The example I have posted is simplified for illustrative purpose. In
reality, I'm not doing pexpect.spawn(/bin/tcsh). I'm doing
pexpect.spawn(ssh myuser@ipaddress). Since I'm operating on a remote
system, I can't simply open the file in my own python context.


On Jan 15, 2:24 pm, Dennis Lee Bieber wlfr...@ix.netcom.com wrote:
 On Sun, 15 Jan 2012 09:51:44 -0800 (PST), Saqib Ali

 saqib.ali...@gmail.com wrote:
 Now, clearly the file contains tabs. But when I cat it through expect,
 and collect cat's output, those tabs have been converted to spaces.
 But I need the tabs!

 Can anyone explain this phenomenon or suggest how I can fix it?

         My question is:

         WHY are you doing this?

         Based upon the problem discription, as given, the solution would
 seem to be to just open the file IN Python -- whether you read the lines
 and use split() by hand, or pass the open file to the csv module for
 reading/parsing is up to you.

 -=-=-=-=-=-=-
 import csv
 import os

 TESTFILE = Test.tsv

 #create data file
 fout = open(TESTFILE, w)
 for ln in [  abc,
             defg,
             hijA  ]:
     fout.write(\t.join(list(ln)) + \n)
 fout.close()

 #process tab-separated data
 fin = open(TESTFILE, rb)
 rdr = csv.reader(fin, dialect=excel-tab)
 for rw in rdr:
     print rw

 fin.close()
 del rdr
 os.remove(TESTFILE)
 -=-=-=-=-=-=-
 ['a', 'b', 'c']
 ['d', 'e', 'f', 'g']
 ['h', 'i', 'j', 'A']
 --
         Wulfraed                 Dennis Lee Bieber         AF6VN
         wlfr...@ix.netcom.com    HTTP://wlfraed.home.netcom.com/

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Problem while doing a cat on a tabbed file with pexpect

2012-01-15 Thread Saqib Ali

The file me.txt does indeed contain tabs. I created it with vi.

 text = open(me.txt, r).read()
 print \t in text
True


% od -c me.txt
000   A  \t   B  \t   C  \n
006


% ls -al me.txt
-rw-r--r--   1 myUsermyGroup   6 Jan 15 12:42 me.txt



On Jan 15, 6:40 pm, Cameron Simpson c...@zip.com.au wrote:
 On 15Jan2012 23:04, Steven D'Aprano steve+comp.lang.pyt...@pearwood.info 
 wrote:
 | On Sun, 15 Jan 2012 09:51:44 -0800, Saqib Ali wrote:
 |  I am using Solaris 10, python 2.6.2, pexpect 2.4
 | 
 |  I create a file called me.txt which contains the letters A, B, C
 |  on the same line separated by tabs.
 | [...]
 |  Now, clearly the file contains tabs.
 |
 | That is not clear at all. How do you know it contains tabs? How was the
 | file created in the first place?
 |
 | Try this:
 |
 | text = open('me.txt', 'r').read()
 | print '\t' in text
 |
 | My guess is that it will print False and that the file does not contain
 | tabs. Check your editor used to create the file.

 I was going to post an alternative theory but on more thought I think
 Steven is right here.

 What does:

   od -c me.txt

 show you? TABs or multiple spaces?

 What does:

   ls -ld me.txt

 tell you about the file size? Is it 6 bytes long (three letters, two
 TABs, one newline)?

 Steven hasn't been explicit about it, but some editors will write spaces when
 you type a TAB. I have configured mine to do so - it makes indentation more
 reliable for others. If I really need a TAB character I have a special
 finger contortion to get one, but the actual need is rare.

 So first check that the file really does contain TABs.

 Cheers,
 --
 Cameron Simpson c...@zip.com.au DoD#743http://www.cskk.ezoshosting.com/cs/

 Yes Officer, yes Officer, I will Officer. Thank you.

-- 
http://mail.python.org/mailman/listinfo/python-list


Changing the system clock with pexpect confuses pexpect!

2011-12-26 Thread Saqib Ali

See my code below.

I'm controlling a shell logged in as root with pexpect.

The class below has a method (startProc) which spawns a shell and
keeps it alive until told to destroy it (stopProc).

The other 2 methods in this class allow me to change the system clock
and to get the IP Address of this machine.

They all work fine except when I advance the system clock, and
then try to get the IP Address.
In that case, I get an exception because pexpect incorrectly thinks
the output it is getting from ifconfig is invalid. But it is not.
Pexpect is just confused. This doesn't happen when I move the clock
backwards. It only happens when I move the clock forward.

I believe what is going on is that internally pexpect uses the system
clock to keep track of when it receives data from spawned processes.
When I mess with the clock, that messes up the internal workings of
pexpect.

Any suggestions what I should do? I have numerous concurrent pexpect
processes running when I modify the clock. Is there anyway to prevent
them all from getting totally screwed up??

-


#!/usr/bin/env python
import pexpect, os, time, datetime, re

def reportPrint(string):
print string

def reportAssert(condition, string)
if condition == False:
print string
raise Exception


class rootManager:

rootProc = None
rootPrompt = ] % 
myPrompt = ] % 

def __init__(self):
pass




def startProc(self):
if self.rootProc != None:
reportPrint(\t\t- Root Process is already created)
else:
self.rootProc = pexpect.spawn ('/bin/tcsh',)
i = self.rootProc.expect([pexpect.TIMEOUT,
self.myPrompt,])
reportAssert(i != 0, Time-Out exiting)

reportPrint(\t\t- Sending su)
self.rootProc.sendline(su)
i = self.rootProc.expect([pexpect.TIMEOUT, Password: ,])
reportAssert(i != 0, Time-Out exiting)

reportPrint(\t\t- Sending Password)
self.rootProc.sendline(ROOT_PASSWORD)
i = self.rootProc.expect([pexpect.TIMEOUT,
self.rootPrompt,])
reportAssert(i != 0, Time-Out exiting)

reportPrint(\t\t- Root Process created)


def getIPAddr(self):
reportAssert(self.rootProc != None, No active Root Process!)

reportPrint(\t\t- Sending ifconfig -a)
self.rootProc.sendline(ifconfig -a)
i = self.rootProc.expect([pexpect.TIMEOUT, self.rootPrompt,])
reportAssert(i != 0, Time-Out exiting)

outputTxt = self.rootProc.before
ipList = [i for i in re.compile((?=inet )\d{1,3}\.\d{1,3}\.
\d{1,3}\.\d{1,3}).findall(outputTxt) if i != 127.0.0.1]
reportAssert(len(ipList) == 1, Cannot determine IP Address
from 'ifconfig -a': \n%s % outputTxt)
return ipList[0]


def changeClock(self, secondsDelta):
reportAssert(self.rootProc != None, No active Root Process!)

newTime = datetime.datetime.now() +
datetime.timedelta(seconds=secondsDelta)
dateStr = %02d%02d%02d%02d%s % (newTime.month, newTime.day,
newTime.hour, newTime.minute, str(newTime.year)[-2:])
reportPrint(\t\t- Sending 'date %s' command % dateStr)
self.rootProc.sendline(date %s % dateStr)
#Remember, by changing the clock, you are confusing pexpect's
timeout measurement!
# so ignore timeouts in this case
i = self.rootProc.expect([pexpect.TIMEOUT,
self.rootPrompt,],)






def stopProc(self):
if self.rootProc == None:
reportPrint(\t\t- Root Process is already destroyed)
else:

reportPrint(\t\t- Sending exit command)
rootProc.sendline(exit)
i = rootProc.expect([pexpect.TIMEOUT, self.myPrompt])
reportAssert(i != 0, Time-Out exiting)

reportPrint(\t\t- Sending exit command)
rootProc.sendline(exit)
i = rootProc.expect([pexpect.TIMEOUT, pexpect.EOF])
reportAssert(i != 0, Time-Out exiting)
self.rootProc.close()
self.rootProc = None
reportPrint(\t\t- Root Process Destroyed)



-- 
http://mail.python.org/mailman/listinfo/python-list


Can't I define a decorator in a separate file and import it?

2011-12-22 Thread Saqib Ali


I'm using this decorator to implement singleton class in python:

http://stackoverflow.com/posts/7346105/revisions

The strategy described above works if and only if the Singleton is
declared and defined in the same file. If it is defined in a different
file and I import that file, it doesn't work.

Why can't I import this Singleton decorator from a different file?
What's the best work around?
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Can't I define a decorator in a separate file and import it?

2011-12-22 Thread Saqib Ali
MYCLASS.PY:

#!/usr/bin/env python
import os, sys, string, time, re, subprocess
import Singleton


@Singleton
class myClass:

def __init__(self):
print 'Constructing myClass'

def __del__(self):
print 'Destructing myClass'


SINGLETON.PY:


#!/usr/bin/env python
import os, sys, string, time, re, subprocess
import Singleton


@Singleton
class myClass:

def __init__(self):
print 'Constructing myClass'

def __del__(self):
print 'Destructing myClass'

TRACEBACK:

 import myClass
Traceback (most recent call last):
  File stdin, line 1, in module
  File myClass.py, line 6, in module
@Singleton
TypeError: 'module' object is not callable



- Saqib






 Post the code, and the traceback.

 ~Ethan~
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Can't I define a decorator in a separate file and import it?

2011-12-22 Thread Saqib Ali
BTW Here is the traceback:

 import myClass
Traceback (most recent call last):
  File stdin, line 1, in module
  File myClass.py, line 6, in module
@Singleton
TypeError: 'module' object is not callable



Here is Singleton.py:



class Singleton:

def __init__(self, decorated):
self._decorated = decorated

def Instance(self):
try:
return self._instance
except AttributeError:
self._instance = self._decorated()
return self._instance

def __call__(self):
raise TypeError(
'Singletons must be accessed through the `Instance`
method.')



Here is myClass.py:

#!/usr/bin/env python
import os, sys, string, time, re, subprocess
import Singleton


@Singleton
class myClass:

def __init__(self):
print 'Constructing myClass'

def __del__(self):
print 'Destructing myClass'
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Can't I define a decorator in a separate file and import it?

2011-12-22 Thread Saqib Ali
Thanks for pointing out the mistake!
Works.
- Saqib




On Thu, Dec 22, 2011 at 4:31 PM, Ethan Furman et...@stoneleaf.us wrote:

 Saqib Ali wrote:

 MYCLASS.PY:

 #!/usr/bin/env python
 import os, sys, string, time, re, subprocess
 import Singleton


 This should be 'from Singleton import Singleton'



  @Singleton
 class myClass:
def __init__(self):
print 'Constructing myClass'


 At this point, the *instance* of myClass has already been constructed and
 it is now being initialized.  The __new__ method is where the instance is
 actually created.



def __del__(self):
print 'Destructing myClass'


   class Singleton:
 
  def __init__(self, decorated):
  self._decorated = decorated
 
  def Instance(self):
  try:
  return self._instance
  except AttributeError:
  self._instance = self._decorated()
  return self._instance
 
  def __call__(self):
  raise TypeError(
  'Singletons must be accessed through the `Instance`
  method.')


 ~Ethan~

-- 
http://mail.python.org/mailman/listinfo/python-list


Can I get use pexpect to control this process?

2011-12-21 Thread Saqib Ali

I have a program X that constantly spews output, hundreds of lines per
minute.
X is not an interactive program. IE: it doesn't take any user input.
It just produces a lot of textual output to STDOUT.

I would like to save the output produced by X into a different file
every 5 seconds regardless of the actual content. I want one file to
contain the output from seconds 0-5, another file should contain 6-10,
etc. etc.

Can I do this with pexpect? I'm not sure I can because the before
argument gives me EVERYTHING upto the most recent match. What I really
need is something that will give me what was produced between the last
2 calls to pexpect.expect().
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Need help with really elementary pexpect fragment

2011-12-20 Thread Saqib Ali
Oops! Good call.
Thank you. You pointed out my mistake.


- Saqib




On Tue, Dec 20, 2011 at 12:31 AM, Nick Dokos nicholas.do...@hp.com wrote:

 Saqib Ali saqib.ali...@gmail.com wrote:

 
  I want to write a pexpect script that simply cd's into a directory (~/
  install) and then runs a command from there. It should be so easy.
  But even my cd command is failing. Can't figure out what the problem
  is. The command line prompt is [my machine name here] % 
 
  Here is the code fragment:
 
  print Spawning Expect
  p = pexpect.spawn ('/bin/tcsh',)
 

 If you execute /bin/tcsh by hand, do you get a % prompt?

 Nick

  print Sending cd command
  i = p.expect([pexpect.TIMEOUT, %,])
  assert i != 0, Time-Out exiting
  p.sendline(cd ~/install)
 
  Here is the output:
 
  Spawning Expect
  Sending cd command
  Time-Out exiting
 
 
  How could I be screwing something so simple up??
  --
  http://mail.python.org/mailman/listinfo/python-list
 

-- 
http://mail.python.org/mailman/listinfo/python-list


Need help with really elementary pexpect fragment

2011-12-19 Thread Saqib Ali

I want to write a pexpect script that simply cd's into a directory (~/
install) and then runs a command from there. It should be so easy.
But even my cd command is failing. Can't figure out what the problem
is. The command line prompt is [my machine name here] % 

Here is the code fragment:

print Spawning Expect
p = pexpect.spawn ('/bin/tcsh',)

print Sending cd command
i = p.expect([pexpect.TIMEOUT, %,])
assert i != 0, Time-Out exiting
p.sendline(cd ~/install)

Here is the output:

Spawning Expect
Sending cd command
Time-Out exiting


How could I be screwing something so simple up??
-- 
http://mail.python.org/mailman/listinfo/python-list


Inexplicable behavior in simple example of a set in a class

2011-07-02 Thread Saqib Ali


I have written two EXTREMELY simple python classes. One class
(myClass1) contains a data attribute (myNum) that contains an integer.
The other class (myClass2) contains a data attribute (mySet) that
contains a set.

I instantiate 2 instances of myClass1 (a  b). I then change the value
of a.myNum. It works as expected.

Then I instantiate 2 instances of myClass2 (c  d). I then change the
value of c.mySet. Bizarrely changing the value of c.mySet also affects
the value of d.mySet which I haven't touched at all!?!?! Can someone
explain this very strange behavior to me? I can't understand it for
the life of me.

Please see below the source code as well as the output.


-- SOURCE CODE --
import sets

class myClass1:

myNum = 9

def clearNum(self):
self.myNum = 0

def __str__(self):
  return str(self.myNum)

class myClass2:

mySet = sets.Set(range(1,10))

def clearSet(self):
self.mySet.clear()

def __str__(self):
  return str(len(self.mySet))

if __name__ == __main__:

# Experiment 1. Modifying values of member integers in two
different instances of a class
# Works as expected.
a = myClass1()
b = myClass1()
print a = %s % str(a)
print b = %s % str(b)
print a.clearNum()
a.clearNum()
print a = %s % str(a)
print b = %s\n\n\n % str(b)



# Experiment 2. Modifying values of member sets in two different
instances of a class
# Fails Unexplicably. d is not being modified. Yet calling
c.clearSet() seems to change d.mySet's value
c = myClass2()
d = myClass2()
print c = %s % str(c)
print d = %s % str(d)
print c.clearSet()
c.clearSet()
print c = %s % str(c)
print d = %s % str(d)




-- OUTPUT --
 python.exe myProg.py

a = 9
b = 9
a.clearNum()
a = 0
b = 9



c = 9
d = 9
c.clearSet()
c = 0
d = 0
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Inexplicable behavior in simple example of a set in a class

2011-07-02 Thread Saqib Ali
 Instance variables are properly created in the __init__()
 initializer method, *not* directly in the class body.

 Your class would be correctly rewritten as:

 class MyClass2(object):
     def __init__(self):
         self.mySet = sets.Set(range(1,10))

     def clearSet(self):
 # ...rest same as before...


Thanks Chris. That was certainly very helpful!!

So just out of curiosity, why does it work as I had expected when the
member contains an integer, but not when the member contains a set?
-- 
http://mail.python.org/mailman/listinfo/python-list