【问题标题】:Starting jython program from python using subprocess module?使用 subprocess 模块从 python 启动 jython 程序?
【发布时间】:2011-05-07 00:06:51
【问题描述】:

我有一个 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

当客户端连接时,服务器在其命令/终端窗口中打印出信息(当前用于调试),客户端程序在其命令/终端窗口中打印出调试信息。 我想做的是通过使用 subprocess 模块从我的“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 和 windows 的解决方案,您将是我的英雄。由于某种原因,当我添加 creationflags = subprocess.CREATE_NEW_CONSOLE 时,我无法更改子进程的标准输入或标准输出规范。

【问题讨论】:

  • 如果有人能找到一种优雅的方式让popen 在 Windows 和 Linux 上工作,我将创建一个赏金和奖励代表。
  • 为什么不创建简单的 .bat/bash 脚本来启动这两个程序?

标签: python subprocess jython


【解决方案1】:

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

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

您可以通过这种方式摆脱 os.getcwd 调用和两个 os.chdir 调用。如果您希望能够在 Linux 上使用此脚本,则必须不使用“cmd”。所以调用 Popen 时使用["jython", file] 作为第一个参数。

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

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

这将与以前相同,只是当子流程模块未定义 CREATE_NEW_CONSOLE 时它会回退到默认值 0。

【讨论】:

    猜你喜欢
    • 2011-07-27
    • 1970-01-01
    • 2015-10-07
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 2011-10-30
    • 2014-06-15
    相关资源
    最近更新 更多