- 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/
好的,所以我编辑了以下... 只需将以下内容放入我的 custom.css #rt-utility .rt-block {CODE HERE} 但是当我尝试改变... 与 #rt-sideslid
在表格 View 中,我有一个自定义单元格(在界面生成器中高度为 500)。在该单元格中,我有一个 Collection View ,我按 (10,10,10,10) 固定到边缘。但是在 tablev
对于我的无能,我很抱歉,但总的来说,我对 Cocoa、Swift 和面向对象编程还很陌生。我的主要来源是《Cocoa Programming for OS X》(第 5 版),以及 Apple 的充满
我正在使用 meta-tegra 为我的 NVIDIA Jetson Nano 构建自定义图像。我需要 PyTorch,但没有它的配方。我在设备上构建了 PyTorch,并将其打包到设备上的轮子中。现
在 jquery 中使用 $.POST 和 $.GET 时,有没有办法将自定义变量添加到 URL 并发送它们?我尝试了以下方法: $.ajax({type:"POST", url:"file.php?
Traefik 已经默认实现了很多中间件,可以满足大部分我们日常的需求,但是在实际工作中,用户仍然还是有自定义中间件的需求,为解决这个问题,官方推出了一个 Traefik Pilot[1] 的功
我想让我的 CustomTextInputLayout 将 Widget.MaterialComponents.TextInputLayout.OutlinedBox 作为默认样式,无需在 XML 中
我在 ~/.emacs 中有以下自定义函数: (defun xi-rgrep (term) (grep-compute-defaults) (interactive "sSearch Te
我有下表: 考虑到每个月的权重,我的目标是在 5 个月内分散 10,000 个单位。与 10,000 相邻的行是我最好的尝试(我在这上面花了几个小时)。黄色是我所追求的。 我试图用来计算的逻辑如下:计
我的表单中有一个字段,它是文件类型。当用户点击保存图标时,我想自然地将文件上传到服务器并将文件名保存在数据库中。我尝试通过回显文件名来测试它,但它似乎不起作用。另外,如何将文件名添加到数据库中?是在模
我有一个 python 脚本来发送电子邮件,它工作得很好,但问题是当我检查我的电子邮件收件箱时。 我希望该用户名是自定义用户名,而不是整个电子邮件地址。 最佳答案 发件人地址应该使用的格式是: You
我想减小 ggcorrplot 中标记的大小,并减少文本和绘图之间的空间。 library(ggcorrplot) data(mtcars) corr <- round(cor(mtcars), 1)
GTK+ noob 问题在这里: 是否可以自定义 GtkFileChooserButton 或 GtkFileChooserDialog 以删除“位置”部分(左侧)和顶部的“位置”输入框? 我实际上要
我正在尝试在主页上使用 ajax 在 magento 中使用 ajax 显示流行的产品列表,我可以为 5 或“N”个产品执行此操作,但我想要的是将分页工具栏与结果集一起添加. 这是我添加的以显示流行产
我正在尝试使用 PasswordResetForm 内置函数。 由于我想要自定义表单字段,因此我编写了自己的表单: class FpasswordForm(PasswordResetForm):
据我了解,新的 Angular 7 提供了拖放功能。我搜索了有关 DnD 的 Tree 组件,但没有找到与树相关的内容。 我在 Stackblitz 上找到的一个工作示例.对比drag'ndrop功能
我必须开发一个自定义选项卡控件并决定使用 WPF/XAML 创建它,因为我无论如何都打算学习它。完成后应该是这样的: 到目前为止,我取得了很好的进展,但还有两个问题: 只有第一个/最后一个标签项应该有
我要定制xtable用于导出到 LaTeX。我知道有些问题是关于 xtable在这里,但我找不到我要找的具体东西。 以下是我的表的外观示例: my.table <- data.frame(Specif
用ejs在这里显示日期 它给我结果 Tue Feb 02 2016 16:02:24 GMT+0530 (IST) 但是我需要表现为 19th January, 2016 如何在ejs中执行此操作?
我想问在 JavaFX 中使用自定义对象制作 ListView 的最佳方法,我想要一个每个项目如下所示的列表: 我搜了一下,发现大部分人都是用细胞工厂的方法来做的。有没有其他办法?例如使用客户 fxm
我是一名优秀的程序员,十分优秀!