2010-11-09 80 views
4

我有一个jython服务器脚本(称为rajant_server.py),它与java api文件进行交互以通过特殊网络无线电进行通信。我有一个作为客户端的Python程序(还有其他一些功能)。目前,我必须通过打开命令/终端窗口,输入第一个启动服务器:使用子进程模块从python启动jython程序?

cd [path to directory containing rajant_server.py 
jython rajant_server.py 

一旦服务器成功连接它等待客户端,这是我通过运行开始:

cd [path to directory containing python client program] 
python main.py 

当客户端连接时,服务器在其命令/终端窗口中输出信息(当前用于调试),客户端程序在其命令/终端窗口中输出调试信息。 我想要做的是通过使用子进程模块从我的'main.py'程序中调用jython来消除复杂的进程。

的问题是双重的:

1 - 我需要rajant_server.py程序在它自己的终端/命令窗口中打开

2 - Jython的需求在目录中运行,其中rajant_server .py文件存储,换句话说,键入以下到命令/终端窗口不起作用(不要问我为什么):

jython C:/code_dir/comm/server/rajant_server.py 

但:

cd C:/code_dir/comm/server 
jython rajant_server.py 

确实有效。


好吧......我刚刚有一些工作。这看起来有点像黑客,所以我仍然喜欢更好的方法。这是我目前在做什么:

serverfile = r'rajant_server_v2.py' 
serverpath = os.path.join(os.path.realpath('.'),'Comm',serverfile) 
serverpath = os.path.normpath(serverpath) 
[path,file] = os.path.split(serverpath) 

command = '/C jython '+file+'\n' 
savedir = os.getcwd() 
os.chdir(path) 
rajantserver = subprocess.Popen(["cmd",command],\ 
     creationflags = subprocess.CREATE_NEW_CONSOLE) 

#Change Directory back 
os.chdir(savedir) 
#Start Client 
rajant = rajant_comm.rajant_comm() 
rajant.start() 

如果你有一个解决方案,将在这两个Linux的工作&窗口,你将是我的英雄。出于某种原因,当我添加creationflags = subprocess.CREATE_NEW_CONSOLE时,我无法更改子流程的stdin或stdout规范。

+0

如果任何人都可以找到一个在Windows和Linux上都有'popen'工作的优雅方法,我将创建一个赏金和奖励代表。 – 2010-11-09 02:49:42

+0

为什么不创建启动这两个程序的简单.bat/bash脚本? – 2010-11-09 09:19:45

回答

1

子进程中的Popen函数接受一个可选参数'cwd'来定义子进程的当前工作目录。

rajantserver = subprocess.Popen(["cmd",command],\ 
     creationflags = subprocess.CREATE_NEW_CONSOLE,\ 
     cwd = path) 

可以摆脱os.getcwd通话和os.chdir调用此方法两个。如果你想在Linux上使用这个脚本,你必须不使用'cmd'。所以打电话给Popen ["jython", file]作为第一个参数。

编辑:我刚刚看到CREATE_NEW_CONSOLE没有在Linux上运行时在子进程模块中定义。使用此:

creationflags = getattr(subprocess,"CREATE_NEW_CONSOLE",0),\ 

这将是和以前一样,但它退到默认值为0时,子模块没有定义CREATE_NEW_CONSOLE。