creating a block file for file-like object

Iain iain.murchland at gmail.com
Mon Nov 10 03:12:56 CET 2008


On Nov 8, 10:00 am, Iain <iain.murchl... at gmail.com> wrote:
> On Nov 7, 4:42 pm, Lawrence D'Oliveiro <l... at geek-
>
> central.gen.new_zealand> wrote:
> > In message
> > <e424a5ea-0a62-4ca1-842b-cb2cc2cea... at n33g2000pri.googlegroups.com>, Iain
> > wrote:
>
> > > Can someone give me some pointers as to how I might create some sort
> > > of blocking device file or named pipe ...
>
> >     mkfifo /path/to/named/pipe
>
> Thanks.
>
> I did get that far myself with os.mkfifo - my problem is actually
> using it. To me it seemed like I wanted to do something like
>
> streamobj = urllib.urlopen("http://whereever.com/file")
> fifoobj = open("/path/to/named/pipe","w")
> fifoobj.write(streamobj.read())
> TroublesomeFunction("/path/to/named/pipe")
>
> But as soon as you get to the second line the code hangs (apparently
> because of the blocking behaviour of the named pipe).
>
> Any pointers here would be much appreciated.

Well I did work out *a* solution this way:

  pipename = os.tmpnam()
  os.mkfifo(pipename)
  pid = os.fork()
  if pid==0:
    fifoobj = open(pipename,"w")
    fifoobj.write(streamobj.read())
    fifoobj.close()
    os.unlink(pipename)
  else:
    TroublesomeFunction(pipename)

I'd have to say it doesn't strike me as the BEST solution, but it
works. In particular the use of os.tmpnam() gives a warning that its
use is a potential security vulnerability, but this is inevitable if
taking the named pipe approach (any other suggestions are most
welcome, of course). And it doesn't fail very gracefully in that if
TroublesomeFunction stops before attempting to open/read the pipe,
then the child process stays hung waiting for the other end of the
pipe to open. In an interactive python shell you also get some weird
behaviour in this situation, but I'm not entirely sure what the exact
cause of that is.



More information about the Python-list mailing list