2013-09-01 39 views
0

我正在运行python 2.7.3并执行一些涉及os模块的基本工作。基于我见过我希望工作代码示例Python os.popen需要一个整数?

import os 

def main(): 
    f= os.popen('cat > out', 'w',1) 
    os.write(f, 'hello pipe') 
    os.close(f) 

main() 

,但解释给出了这样的错误:

Traceback (most recent call last): 
    File "./test.py", line 11, in <module> 
    main() 
    File "./test.py", line 8, in main 
    os.write(f, 'hello pipe') 
TypeError: an integer is required 

好了,关闭的文档。帮助页面上说:

write(...) 
    write(fd, string) -> byteswritten 

    Write a string to a file descriptor. 

fd似乎代表文件描述符。想必这是你做什么时,你会得到:

file = open('test.py') 

毫不奇怪,在线文档说,完全一样的东西。 这是怎么回事?

+1

使用'subprocess'? –

+0

因为我想从网站获取数据,并且随着数据传入另一个进程。有没有更好的方法来做到这一点与子进程? – Muricula

回答

6

不,“文件描述符”是一个整数,而不是file对象。要从file对象转到文件扫描器,请致电file.fileno()。即:

>>> f = open("tmp.txt", "w") 
>>> help(f.fileno) 
Help on built-in function fileno: 

fileno(...) 
    fileno() -> integer "file descriptor". 

    This is needed for lower-level file interfaces, such os.read(). 

>>> f.fileno() 
4 

而不是使用,不过,你可能只是想做到以下几点,除非你真的需要使用低级别的功能,出于某种原因的:为什么不干脆

f = os.popen('cat > out', 'w',1) 
f.write('hello pipe') 
f.close() 
+0

所以它工作,但为什么python使用一个整数作为文件描述符?为什么不只是文件对象?文件描述符是某种指针吗? – Muricula

+1

@Muricula:文件描述符将与低级C库进行接口。这是他们用来做文件I/O的。 python很好地包装了这个文件对象,但是如果你使用低级库,那么你必须给他们他们知道的东西 – Claudiu