我有一个jython服务器脚本(称为rajant_server.py),它与java api文件交互,通过特殊的网络无线电进行通信。我有一个python程序充当客户端(并做其他几件事)。目前,我必须首先打开一个命令/终端窗口并输入:
来启动服务器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和Linux窗户你会成为我的英雄。出于某种原因,当我添加creationflags = subprocess.CREATE_NEW_CONSOLE时,我无法更改子进程上的stdin或stdout规范。
答案 0 :(得分:1)
子进程中的Popen函数接受可选参数'cwd',以定义子进程的当前工作目录。
rajantserver = subprocess.Popen(["cmd",command],\
creationflags = subprocess.CREATE_NEW_CONSOLE,\
cwd = path)
你可以通过这种方式摆脱os.getcwd调用和两个os.chdir调用。如果您希望能够在Linux上使用此脚本,则必须不使用“cmd”。所以用["jython", file]
作为第一个参数调用Popen。
编辑:我刚刚看到在Linux上运行时,子进程模块中没有定义CREATE_NEW_CONSOLE。使用此:
creationflags = getattr(subprocess,"CREATE_NEW_CONSOLE",0),\
这与以前相同,只是当子进程模块没有定义CREATE_NEW_CONSOLE时,它会回退到默认值0。