在子进程调用期间获取'\n'(默认为新行)on date format为什么?

2024-05-23 14:04:35 发布

您现在位置:Python中文网/ 问答频道 /正文

这里是痕迹

IOError: [Errno 2] No such file or directory: 'security01/30/15,15:32:58\n.jpg' 
#how and why \n come here?

对于这些线路:

^{pr2}$

使用的附加行:

(output, err) = p.communicate()
    args = ['fswebcam','--no-banner','-r',' 960x720','filename' +       str(output) + '.jpg']
    subprocess.call(args)

另一行:

mail('mail@mail.com',
   'subject',
   'body',
   'filename' + str(output)  + '.jpg')

Tags: ornooutputargsmailfilenamedirectoryfile
2条回答

date在其输出的末尾返回一个换行符,因此您需要使用strip()方法来删除它。在

p = subprocess.Popen(['date +%m/%d/%y,%H:%M:%S'], stdout=subprocess.PIPE, shell=True)
stdout = p.communicate()[0].strip()
^{pr2}$

但是,如果您希望在文件名中添加日期/时间戳,最好直接在Python中使用datetime modulestrftime函数:

from datetime import datetime
print datetime.now().strftime('%m/%d/%y,%H:%M:%S')
>>> '01/30/15,10:47:37'

date命令,以及基本上用于交互式命令行的所有其他命令,都用一个新行终止其输出。在

如果这不是您所需要的,那么从子进程调用的输出中修剪最后一行是一件非常常见的事情(在shell中,用`backticks`和现代的$(command)语法替换进程的硬编码默认行为)。在

但创建日期字符串并不需要子进程,Python在其标准库中提供了广泛(尽管有点笨拙)的支持,即开箱即用。参见例如here。在

import time
filename = time.strftime('security%Y.%m.%d_%H.%M.%S.jpg')

或者,改编成第一个示例片段

^{pr2}$

因为斜杠和冒号都是文件名中有问题的字符,所以我用点代替了它们。出于纯粹的美学原因,我还将逗号改为下划线(怀疑;下划线也很难看)。在

我还将生成的文件名切换为使用标准的日期戳命名约定,首先使用一个完整的数字年份,这样文件列表和glob循环以正确的日期顺序生成文件。在

可能应该进一步调整代码,使其在文件名中包含一个正确的ISO 8601日期;然后,如果您想单独解析并重新格式化它以供人类使用,您可以自由地这样做。但是,如果有标准格式,既可以由现有代码读写,也可以被人类毫不含糊地理解,就要避免自定义日期格式。在

相关问题 更多 >