- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想了解自定义文件描述符如何在 Python 中用于输入、输出、默认设置和最终关闭。我在 Bash 中有一个文件,它完全可以执行我想在 Python 中执行的操作。谁能告诉我这将如何在 Python 中完成?我正在使用 Python 2.7.5、Bash 4.2,并在 CentOS 7.3 上执行。
设置
$ echo "input string" > input
bash_fd.sh
#!/bin/bash
# Demonstration of custom file descriptors in Bash
# 3 script input (scrin)
# 4 script output (scrout)
# 5 script error (screrr)
# 6 script data (scrdata, demo: JSON return payload)
# 7 script log (scrlog)
fd_open()
{
### Provide defaults for file descriptors 3-7 ONLY if the FDs are undefined
{ >&3; } 2>/dev/null || exec 3<&0 # dup scrin to stdin
{ >&4; } 2>/dev/null || exec 4>&1 # dup scrout to stdout
{ >&5; } 2>/dev/null || exec 5>&2 # dup screrr to stderr
{ >&6; } 2>/dev/null || exec 6>/dev/null # set scrdata to /dev/null
{ >&7; } 2>/dev/null || exec 7>/dev/null # set scrlog to /dev/null
}
fd_close()
{
# Close all file descriptors
exec 3>&-
exec 4>&-
exec 5>&-
exec 6>&-
exec 7>&-
}
main()
{
fd_open # Ensure
echo "[$(date)] Program beginning" >&7 # scrlog
echo -n 'Enter a message: ' >&4 # scrout
read MSG <&3 # scrin
echo "Read message $MSG" >&4 # scrout
echo "[screrr] Read message $MSG" >&5 # screrr
echo "{\"msg\": \"$MSG\"}" >&6 # scrdata: return JSON payload
echo "[$(date)] Program finishing: $MSG" >&7 # scrlog
fd_close
return ${1:-0} # return status code
}
# For demonstration purposes, $1 is the return code returned when calling main
main "$1"
调用
$ ./bash_fd.sh 37 3<input 4>scrout 5>screrr 6>scrdata 7>scrlog
$
返回码
$ echo $?
37
生成的文件
$ cat scrout
Enter a message: Read message input string
$ cat screrr
[screrr] Read message input string
$ cat scrdata
{"msg": "input string"}
$ cat scrlog
[Wed Jun 14 21:33:24 EDT 2017] Program beginning
[Wed Jun 14 21:33:24 EDT 2017] Program finishing: input string
将上述 Bash 脚本翻译成 Python 的任何帮助都将真正帮助我理解 Python 和自定义文件描述符,我们将不胜感激。
最佳答案
Python 2 的 file object是 C's stdio
FILE
structure 的一个相当薄的包装,它本身包含相应的描述符(一个整数)。在许多地方,文档都引用了底层/相关的 stdio
,这并非巧合。东西。
每次您创建文件对象 ( open()
) 时,都会打开一个对应于该文件的描述符,并将其用于该对象的所有 I/O 操作。
<file>.fileno()
得到它.os.fdopen()
的文件对象包装它.
bash
重定向脚本的特定描述符,它已为您的子进程打开相应的描述符。当文件对象被关闭或垃圾回收时,底层描述符也被关闭。
with open(...) as f:
强制关闭。这样文件就不会打开超过必要的时间。 os
module还有一些其他函数可以与描述符一起使用,这些描述符反射(reflect)了相应的 C 函数,例如 os.dup()
.
通常,您应该使用文件对象,不要理会它们的底层描述符。即使使用返回原始描述符的函数,您也可以这样做 like with os.pipe()
.
(尖括号中的实体是伪代码,表示要插入的内容)
同时 How to check if a given file descriptor stored in a variable is still valid?建议(仅限 UNIX)fcntl
或(可移植)dup
作为侵入性最小的方式,因为您将通过文件对象使用它,it's best to just attempt to :
import os,errno
<...>
try: f = os.fdopen(<fd>)
except OSError as e:
if e.errno!=errno.EBADF: raise
else:
# actions when doesn't exist, maybe create `f' some other way
else:
#actions when exists
# use `f'
不是真的需要 - 你可以分配例如f = sys.stdin
根据条件和用途 f
. 您真正需要它的唯一情况是您必须向其他进程提供额外的 FD。
new_fd = os.dup(fd)
为新的 FD 使用最小的可用数字os.dup2(old_fd,new_fd)
使用一个特定的,如果它已经打开则关闭它例如复制文件对象的 FD 并在副本上创建另一个文件对象:
os.dup2(old_f.fileno(),<new_fd>)
new_f = os.fdopen(<new_fd>)
读取/写入/关闭/任何包装该 FD 的文件对象。参见 Reading and Writing files - Python tutorial , 唯一的区别是如果你有一个原始的 FD,你用 os.fdopen()
创建文件对象而不是 open()
.
关于python - 在 Python 中,自定义文件描述符如何用于输入和输出,包括默认设置和最终关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44557281/
来自descriptor文档: A descriptor can be called directly by its method name. For example, d.__get__(obj).
概要 本人python理论知识远达不到传授级别,写文章主要目的是自我总结,并不能照顾所有人,请见谅,文章结尾贴有相关链接可以作为补充 全文分为三个部分装饰器理论知识、装饰器应用、装饰器延申
我正在查看 python 的描述 rune 档 here ,让我思考的陈述是: 对于物体,机械在 object.__getattribute__()转换 b.x进入 type(b).__dict__[
if((fd = creat(file_name,O_RDWR|S_IRWXU|S_IRWXG|S_IRWXO)) < 0){ perror("Create failed!");
长话短说Python 2.7.5,当使用描述符作为装饰器时,有没有办法传入参数(给 __init__ 方法)?或者如何使用带参数的方法装饰器 ( as here ) 访问类实例的属性? -- 我认为这
我试着用谷歌搜索一些关于它的东西。为什么非数据描述符适用于旧式类? 文档说他们不应该: “Note that descriptors are only invoked for new style ob
我升级到使用嵌入式 maven 3 的 netbeans 7。我有一个项目,其中包含许多模块和包含其他模块的模块。我的其他不依赖于内部项目的子模块可以在相同的配置下正常工作。在这种情况下,spring
我正在关注http://scikit-image.org/docs/0.11.x/auto_examples/plot_daisy.html ,但是不太清楚 desc[0],desc[1] 和 des
我有一个要求,其中有一个全局 FILE指针/描述符。其中一个函数将从该指针/描述符中读取。与FILE指针/描述符相关联的内部指针前进。此函数返回后,我想从同一个 FILE 指针/描述符中读取数据,并与
我正在编写一些描述符来封装数据验证,并想为它们编写测试。 我想知道是否应该通过在我的测试中创建描述符实例然后显式调用 __get__ 或 __set__ 方法来测试它们。 或者我应该在我的测试文件中创
我有这个 python 描述符: # Date Descriptor class DateAttribute(): def __init__(self, value=None):
分割: @font-face { font-family: 'RobotoLight'; src: url('../font/jura-demibold.eot'); src: url('../fon
我正在编写一个配置卷的存储自动化模块。我没有传递在存储 Controller 上实际创建卷所需的六个或更多参数,而是使用 __slots__ 创建了一个参数类,它被传递到 create 方法中,如下所
在我的应用程序中,我必须使用静态摄像头跟踪大学讲座中的讲师。目前我正在使用 Emgu CV 的默认 GPUHOGDescriptor,如果讲师的整个 body 都可见,它会很好用。在讲师站在 tabl
大家好,我正在使用 opencv3 和 contrib。问题是我想计算给定像素的筛选描述符(不使用检测到的关键点)。 我正在尝试用给定的像素构建一个关键点向量。但是,要创建关键点,除了像素位置外,我还
我正在使用 OpenCV 中的 HOGDescriptor 类进行对象检测。在我看来,该实现仅使用无符号渐变,因此无法区分亮->暗和暗->亮过渡,这是我真正需要的功能。有谁知道使用有符号梯度的 HOG
我目前正在使用 OpenCV 的 ORB 特征提取器,我确实注意到 ORB 描述符的存储方式很奇怪(至少对我来说是这样)(它基本上是一个 BRIEF-32,带有与我的问题无关的修改) .正如你们中的一
我想知道,在 MATLAB 中是否有针对“汽车”之类的对象而非人类的 HOG 描述符的任何实现? 但万一,只有人类,你能指导我找到那个代码,并给我一些提示,以改进代码以用于“汽车或摩托车等物体” 最佳
我正在尝试更好地理解描述符。 我不明白为什么在 foo 方法中描述符 __get__ 方法未被调用。 据我了解描述符 __get__ 当我通过点运算符访问对象属性或使用 __getattribute_
我想要一个类似于这个(无效)的结构: const uint8_t uArray[] = { uint8_t(sizeof(uArray)), 1, 2, 3 }; 并且 uArray[0] 应该是 4
我是一名优秀的程序员,十分优秀!