因为我碰到项目需求需要用python去调用jython的文件.因为虽然都是python家族,但是一个是java一个是c的,所以研究了下文件交互的方法,虽然结论不用这个模式,但是记录下这个经验.
一般最简单会想到os.system和os.popen,
os.system("test.py 1 2 3")
在代码中,可以通过sys.argv来获取入参,但是问题来了,我想返回参数的话,基本上是返回不了的.
后来通过研究可以通过sys.exit()来返回自定义参数,但是这个时候只能用popen了.
但是通过read的函数返回的值通过会连打印信息都返回,我需要的是,调用了一个jython的py文件后返回执行的输出参数的话,就比较困难了.
我看了下subprocess.popen系列,的确很强大:
Popen.stdin
如果在创建Popen对象是,参数stdin被设置为PIPE,Popen.stdin将返回一个文件对象用于策子进程发送指令。否则返回None。
Popen.stdout
如果在创建Popen对象是,参数stdout被设置为PIPE,Popen.stdout将返回一个文件对象用于策子进程发送指令。否则返回 None。
Popen.stderr
如果在创建Popen对象是,参数stdout被设置为PIPE,Popen.stdout将返回一个文件对象用于策子进程发送指令。否则返回 None。
Popen.pid
获取子进程的进程ID。
Popen.returncode
获取进程的返回值。如果进程还没有结束,返回None。
下面是一个非常简单的例子,来演示supprocess模块如何与一个控件台应用程序进行交互。
import subprocess
p = subprocess.Popen(“test.py”, stdin = subprocess.PIPE, /
stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = False)
p.stdin.write(’1’)
print p.stdout.read()
虽然看上去好比os.popen高端些,但是我还是获取到很多不需要的输出参数.
后来又找到了一个commands.getstatusoutput
status, output = commands.getstatusoutput("ls")
但是可惜的是,因为我的jython调用了jar包,使用这个方法后会辨认不了java的语法,所以我又失望了下.
因为项目时间原因我就停止研究下去,不过我觉得上面的方法大同小异,有简单有复杂的,所以问题应该是我返回参数的那块没有做好.如果后续有需求,我会继续在返回参数这块做技术研究.