1

我尝试使用 pexpect(甚至直接使用 subprocess.Popen())通过命令行启动服务器应用程序(在 erlang 中,打开端口并侦听 http 请求)。

该应用程序启动正常,日志(通过pexpect)到屏幕正常,我也可以通过命令行与之交互......
问题是服务器不会监听传入的请求。当我通过在命令行中键入命令手动启动它时,该应用程序会进行侦听。使用 subprocess/pexpect 会阻止应用程序以某种方式侦听...
当我手动启动它时,“netstat -tlp”将应用程序显示为正在侦听,当我通过 python (subprocess/pexpect) 启动它时,netstat 不会注册应用程序...

我有一种感觉,它与环境、python 分叉事物的方式等有关。有什么想法吗?

谢谢你

基本示例:注意:
“-pz” - 仅将 ./ebin 广告到 erl VM 的模块路径,库搜索路径
“-run” - 运行 moduleName,不带任何参数。

command_str = "erl -pz ./ebin -run moduleName"  
child = pexpect.spawn(command_str)  
child.interact() # Give control of the child to the user

所有这些东西都能正常工作,这很奇怪。我已经在我的代码中登录,并且所有日志消息都按应有的方式输出。即使我通过 bash 脚本启动它的进程,服务器也不会听,所以我不认为它是导致它的 python 代码(这就是为什么我觉得它与新操作系统进程的启动方式有关)。

4

1 回答 1

0

这可能与命令行参数传递给子进程的方式有关。

如果没有更具体的代码,我不能肯定地说,但我在 sshsplit ( https://launchpad.net/sshsplit )上遇到了这个问题

要正确传递参数(在本例中为“ssh -ND 3000”),您应该使用如下内容:

openargs = ["ssh", "-ND", "3000"]
print "Launching %s" %(" ".join(openargs))
p = subprocess.Popen(openargs, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

这不仅可以让您准确查看正在启动的命令,而且应该正确地将值传递给可执行文件。虽然我不能在没有看到一些代码的情况下肯定地说,但这似乎是最有可能导致失败的原因(是否也可能是程序需要特定的工作目录或配置文件?)。

于 2010-06-01T14:42:59.310 回答