命名管道的问题

Posted

技术标签:

【中文标题】命名管道的问题【英文标题】:Trouble with Named Pipes 【发布时间】:2013-08-25 09:36:34 【问题描述】:

我是使用 php 和 python 的新手,但我有一个任务要尝试完成,而我的测试代码似乎不起作用。基本上我正在尝试将数据从 html 表单(使用 php)获取到 python 脚本进行处理。在查看了其他帖子中一些非常有用的东西之后,我决定使用管道。为了测试这个过程,我使用了以下代码。

php代码:

<?php
$pipe = fopen('Testpipe','r+');
fwrite($pipe, 'Test');
fclose($pipe);
?>

Python 代码:

#!/usr/bin/env python

import os
pipeName = 'Testpipe'
try:
    os.unlink(pipeName)
except:
    pass
os.mkfifo(pipeName)
pipe = open(pipeName, 'r')
while True:
    data = pipe.readline()
    if data != '':
         print repr(data)

当我运行 Python 代码时,我可以看到使用 ls -l 在目录中创建的管道,但是当我使用浏览器运行 php 脚本(我在树莓派上运行网络服务器)时,什么也没有发生。这让我有点困惑,因为我读过的大多数帖子都说明了管道是多么简单。我假设打开浏览器(通过服务器的 php 脚本)我应该看到文本出现在 python shell 中?

任何帮助将不胜感激。

好吧,在我原来的帖子的基础上,我已经修改了我的原始代码,这要归功于大量的网络搜索和一些非常有用的 Python 教程。我现在有一些东西可以证明管道的原理,尽管我仍然需要解决 php 方面的问题,但我觉得我现在已经到了那里。修改后的代码如下:

import os,sys

pipe_name = 'testpipe'

def child():
    pipeout = os.open(pipe_name, os.O_WRONLY)
    while True:
         time.sleep(1)
         os.write(pipeout, 'Test\n')

def parent():
    pipein = open(pipe_name, 'r')
    while True:
         line = pipein.readline()[:-1]
         print 'Parent %d got "%s"' %(os.getpid(),line)

if not os.path.exists(pipe_name):
    os.mkfifo(pipe_name)
pid = os.fork()
if pid != 0:
    parent()
else:
    child()

这让我走上了我想去的道路,所以希望它对有类似问题的人有用。

【问题讨论】:

你为什么用python和php,哪一个都可以,只用一个问题少 嗨 Dagon,它是一个 uni 项目的一部分,所以我必须同时使用这两个,因为我之前没有使用过 php 或 python,这让我有机会学习它们。 【参考方案1】:

尝试提供绝对路径(“/tmp/TestPipe”)以确保两者都在寻找同一个文件。

【讨论】:

嗨,Louis,感谢您的建议,我刚刚尝试过,不幸的是它没有任何区别。我想我希望测试管道文本在 Python shell 中显示(如果它有效)? 我刚刚尝试从相同的 php 代码写入标准文本文件,并且一切正常,所以位置看起来不错。 稍微玩过 Python 代码后,问题似乎与:data = pipe.readline() 行有关,尽管我看不出究竟是什么问题 - 有什么想法吗? Python readline 等待行尾。所以也许在 php 中将 \n 添加到 fwrite 的末尾: fwrite($pipe,'Test\n') 不幸的是,似乎没有任何区别。

以上是关于命名管道的问题的主要内容,如果未能解决你的问题,请参考以下文章

为啥命名管道是本地的?

c中的命名管道

在命名管道上选择

Linux进程间通信

命名管道问题

管道和命名管道