From: Ganesan R <rga...@my...> - 2002-01-24 03:39:04
|
>>>>> "jim" == jim boone <jim...@ba...> writes: > I need to execute commands on AIX, parse the output, and package the results > as a Java Bean. Since I am brand new to Python, I anxiously imported os and > tried to execute os.popen('command') and grab the output stream. However, > popen has not yet been implemented in jython! Given that big let down, does > anyone know how in the world can I execute a shell command and process the > resulting output stream from jython? Thanks in advance for your help! This was a big let down for me too. I saw a module called jnios but that doesn't seem to be maintained any more. I searched google for the reason and figured out that the reason for this is because Java does not support pipes. Wouldn't it be possible to emulate popen with Process.getRunTime().exec()? I guess there's a good reason why that's not done yet; I'd like to know the reason :-). Ganesan |
From: Kevin B. <kb...@ca...> - 2002-01-24 16:35:02
|
One additional caveat: 5- close() doesn't give return process return code correctly - it should be something like: return self.process.exitValue() or None kb Kevin Butler wrote: > import java > import org > def popen(path, mode='r'): > r = java.lang.Runtime.getRuntime() > p = r.exec(path) > return org.python.core.PyFile( > p.getInputStream(), > p.getOutputStream(), > mode > ) > Note the following caveats: > > 1- PyFile is an internal class. It may change! Don't rely on it in code you expect to keep working later. > > 2- To get stderr, we'd need to do some wrapping of the stdout & stderr streams into one. > > 3- I don't think the mode handling is quite right. :-) > > 4- Shell built-ins don't work, because we're not invoking a shell |
From: Syver E. <syv...@on...> - 2002-01-25 04:40:27
|
Thanks, I'll fix it. In my opinion could be much more compliant with CPython without doing anything special. As I don't know java, this is maybe more important to me than to people who are used to the java libraries and don't notice problems when using standard python modules and modules they've written for CPython. -- Vennlig hilsen Syver Enstad |
From: Syver E. <syv...@on...> - 2002-01-26 23:37:45
|
This should be a bit better. I tried first to make a subclass of org.python.core.PyFile but I got an error message trying to assign the self._process attribute to self. Anyone knows why? I thought one could assign attributes to subclasses of Java classes, but then I am pretty new in the jython game. class _ProcessFile: def __init__(self, stream, process, name): self._file = org.python.core.PyFile(stream, "'%s'" % name) self._process = process def __getattr__(self, name): return getattr(self._file, name) def __repr__(self): return `self._file` def close(self): self._file.close() return self._process.waitFor() or None def _startProcess(path): r = java.lang.Runtime.getRuntime() try: p = r.exec(path) return p except java.io.IOException, exc: raise OSError(0, exc.toString()) def popen(path, mode='r'): p = _startProcess(path) if mode == 'r': return _ProcessFile(p.getInputStream(), p, path) elif mode == 'w': return _ProcessFile(p.getOutputStream(), p, path) else: raise OSError(0, "Invalid mode", mode) def popen2(path): p = _startProcess(path) return (_ProcessFile(p.getInputStream(), p, path), _ProcessFile(p.getOutputStream(), p,path)) def popen3(path): p = _startProcess(path) return (_ProcessFile(p.getInputStream(), p, path), _ProcessFile(p.getOutputStream(),p, path), _ProcessFile(p.getErrorStream(), p, path)) -- Vennlig hilsen Syver Enstad |
From: Samuele P. <ped...@bl...> - 2002-01-25 12:09:23
|
Hi. [Syver Enstad] > Thanks, I'll fix it. In my opinion could be much more compliant with > CPython without doing anything special. Bare opinions count so little <wink>. Btw some people do care about this so you will see some improvements and we have had some improvement (os.system ...). > As I don't know java, this is > maybe more important to me than to people who are used to the java > libraries and don't notice problems when using standard python modules > and modules they've written for CPython. It's is simpler than that. It's a matter of agendas. See - Core language compatibility - Support for shell-like programming * - Introspection/analysis tools compatibility - Support for the "internet protocols" CPython modules - Better Java/Java frameworks integration - Fixing bugs - Refactoring, avoiding that the codebase becomes a mess This is in no particular order, but confronted with such a least many mantainers have/will pick * as the item with the lowest priority. Jython is not primarily about that. regards, Samuele Pedroni. PS: Properly supporting shell-like programming across platforms over Java is more painful than it seems. |
From: Samuele P. <ped...@bl...> - 2002-01-25 12:29:55
|
Oops > > This is in no particular order, but confronted with such > a least many mantainers have/will pick * as the item ^list > with the lowest priority. Jython is not primarily about that. > |
From: Syver E. <syv...@on...> - 2002-01-26 21:52:59
|
"Samuele Pedroni" <ped...@bl...> writes: > Hi. > > [Syver Enstad] > > Thanks, I'll fix it. In my opinion could be much more compliant with > > > CPython without doing anything special. It wasn't meant that way Samuele, you folks are doing a great job with Jython. So great that I have started using it without having a special interest in java. I am just excited by the idea of having to do the least amount possible of porting between CPython and Jython. I just found it to be easy to implement things like a python startup file for interactive sessions in jython, and am thinking about adding more stuff like the popen things. > PS: Properly supporting shell-like programming across platforms > over Java is more painful than it seems. Of course, but sometimes it's ok to have it done semi properly too which is the situation for CPython on windows where many library functions have stripped down functionality. I'll be looking more into these things as I become more familiar with Jython. -- Vennlig hilsen Syver Enstad |
From: brian z. <bz...@zi...> - 2002-01-24 03:56:41
|
> > This was a big let down for me too. I saw a module called > jnios but that doesn't seem to be maintained any more. I > searched google for the reason and figured out that the > reason for this is because Java does not support pipes. > Wouldn't it be possible to emulate popen with > Process.getRunTime().exec()? I guess there's a good reason > why that's not done yet; I'd like to know the reason :-). > The primary reason is because no one has gotten around to it. Ant, the Java equivalent of make, does an adequate job of capturing output so I'd think Jython could too. I've threatened to write it a couple of times but I either run out of time or work on something more pressing. thanks, brian |
From: Syver E. <syv...@on...> - 2002-01-24 10:19:50
|
Ganesan R <rga...@my...> writes: Here's a quick hack os.popen, it only works for reading at the time, but would be easy to fix I believe. def popen(path, mode='r'): r = java.lang.Runtime.getRuntime() p = r.exec(path) if mode == 'w': return org.python.core.PyFile(p.getInputStream()) elif mode == 'r': return org.python.core.PyFile(p.getOutputStream()) else: raise OSError(0, "Invalid mode", mode) -- Vennlig hilsen Syver Enstad |
From: Syver E. <syv...@on...> - 2002-01-24 10:38:48
|
Syver Enstad <syv...@on...> writes: > Here's a quick hack os.popen, it only works for reading at the time, > but would be easy to fix I believe. > > def popen(path, mode='r'): > r = java.lang.Runtime.getRuntime() > p = r.exec(path) > if mode == 'w': > return org.python.core.PyFile(p.getInputStream()) > elif mode == 'r': > return org.python.core.PyFile(p.getOutputStream()) > else: > raise OSError(0, "Invalid mode", mode) the only trouble I have so far is that the right ctor for PyFile doesn't seem to be because, the PyFile returned is always a PyFile in read mode, even though PyFile has one ctor for java.io.InputStream and one for java.io.OutputStream. -- Vennlig hilsen Syver Enstad |
From: Kevin B. <kb...@ca...> - 2002-01-24 15:54:56
|
Syver Enstad wrote: > > Syver Enstad <syv...@on...> writes: > > Here's a quick hack os.popen, it only works for reading at the time, > > but would be easy to fix I believe. > > > > def popen(path, mode='r'): > > r = java.lang.Runtime.getRuntime() > > p = r.exec(path) > > if mode == 'w': > > return org.python.core.PyFile(p.getInputStream()) > > elif mode == 'r': > > return org.python.core.PyFile(p.getOutputStream()) > > else: > > raise OSError(0, "Invalid mode", mode) > > the only trouble I have so far is that the right ctor for PyFile > doesn't seem to be because, the PyFile returned is always a PyFile in > read mode, even though PyFile has one ctor for java.io.InputStream and > one for java.io.OutputStream. This is because of the wonderful naming convention of the getInputStream/getOutputStream methods :-) : Process.getOutputStream() returns an OutputStream representing stdin (so you can write to the process's stdin) Process.getInputStream() returns an InputStream representing stdout (so you read the process's stdout) Process.getErrorStream() returns an InputStream representing stderr This suggests you need to reverse the 'r' and 'w', and probably end up w/ something like this: import java import org def popen(path, mode='r'): r = java.lang.Runtime.getRuntime() p = r.exec(path) return org.python.core.PyFile( p.getInputStream(), p.getOutputStream(), mode ) f = popen( "echo hello" ) print f.read() f.close() f = popen( "cat" ) f.write( "This is\na test\nof write\n" ) f.flush() for i in range( 3 ): print f.readline(), f.close() try: popen( "set" ) assert "Should throw IOException: CreateProcess "\ "because set is a built-in" except java.io.IOException: print "shell built-ins not supported, " \ "because we're not invoking a shell" Note the following caveats: 1- PyFile is an internal class. It may change! Don't rely on it in code you expect to keep working later. 2- To get stderr, we'd need to do some wrapping of the stdout & stderr streams into one. 3- I don't think the mode handling is quite right. :-) 4- Shell built-ins don't work, because we're not invoking a shell kb > > > -- > > Vennlig hilsen > > Syver Enstad > > _______________________________________________ > Jython-users mailing list > Jyt...@li... > https://lists.sourceforge.net/lists/listinfo/jython-users |