Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Issues with wrapping Java program with Python's subprocess module

I have a small java program that I can run from the command line using this syntax:

java -jar EXEV.jar -s:myfile

This java program print some data to the screen and I want redirect stdout into a file called output.txt.

from subprocess import Popen, PIPE

def wrapper(*args):
    process = Popen(list(args), stdout=PIPE)
    process.communicate()[0]
    return process

x = wrapper('java', '-jar', 'EXEV.jar', '-s:myfile', '>', 'output.txt')

When I run the above, output.txt is never written to and Python does not throw any errors. Can anyone help me figure out the problem?

like image 239
drbunsen Avatar asked Mar 29 '26 22:03

drbunsen


1 Answers

You need to either use stdout=output where output is an open file for writing to 'output.txt' and remove the output redirection from the command, or leave the output redirection in the command and use shell=True with no stdout argument:

Option 1:

from subprocess import Popen

def wrapper(*args):
    output = open('output.txt', w)
    process = Popen(list(args), stdout=output)
    process.communicate()
    output.close()
    return process

x = wrapper('java', '-jar', 'EXEV.jar', '-s:myfile')

Option 2:

from subprocess import Popen

def wrapper(*args):
    process = Popen(' '.join(args), shell=True)
    process.communicate()
    return process

x = wrapper('java', '-jar', 'EXEV.jar', '-s:myfile', '>', 'output.txt')
like image 174
Andrew Clark Avatar answered Apr 02 '26 03:04

Andrew Clark