我正在使用subprocess
运行Unix进程然后捕获输出。像这样:
command_process = subprocess.Popen(
[command],
shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
)
command_output = command_process.communicate()[0]
log_file = open('command.log', 'a')
log_file.write(command_output)
log_file.write('\n')
log_file.close()
我将进程的输出保存到变量command_output
,该变量将被转储到command.log
文件中。
答案 0 :(得分:1)
- 是内存缓冲区中的变量,还是写入磁盘的变量值?
变量位于内存缓冲区中。你可以通过运行(如果你只有一个正在运行的python进程)来看到这个(在Linux上)
pidof python | awk '{print "lsof -a -p "$1}' | bash
示例输出:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
python 19858 jazzpi cwd DIR 8,1 12288 135854 /home/jazzpi
python 19858 jazzpi rtd DIR 8,1 4096 2 /
python 19858 jazzpi txt REG 8,1 2728836 532918 /usr/bin/python2.7
python 19858 jazzpi mem REG 8,1 125424 57 /lib/i386-linux-gnu/libtinfo.so.5.9
python 19858 jazzpi mem REG 8,1 247008 237 /lib/i386-linux-gnu/libreadline.so.6.2
python 19858 jazzpi mem REG 8,1 21648 131133 /usr/lib/python2.7/lib-dynload/readline.so
python 19858 jazzpi mem REG 8,1 2965552 530650 /usr/lib/locale/locale-archive
python 19858 jazzpi mem REG 8,1 114788 13 /lib/i386-linux-gnu/libgcc_s.so.1
python 19858 jazzpi mem REG 8,1 1437864 4337 /lib/i386-linux-gnu/i686/cmov/libc-2.13.so
python 19858 jazzpi mem REG 8,1 148996 4334 /lib/i386-linux-gnu/i686/cmov/libm-2.13.so
python 19858 jazzpi mem REG 8,1 95896 129 /lib/i386-linux-gnu/libz.so.1.2.7
python 19858 jazzpi mem REG 8,1 9800 4326 /lib/i386-linux-gnu/i686/cmov/libutil-2.13.so
python 19858 jazzpi mem REG 8,1 9844 4330 /lib/i386-linux-gnu/i686/cmov/libdl-2.13.so
python 19858 jazzpi mem REG 8,1 117009 4327 /lib/i386-linux-gnu/i686/cmov/libpthread-2.13.so
python 19858 jazzpi mem REG 8,1 26064 523330 /usr/lib/i386-linux-gnu/gconv/gconv-modules.cache
python 19858 jazzpi mem REG 8,1 117960 35 /lib/i386-linux-gnu/ld-2.13.so
python 19858 jazzpi 0u CHR 136,3 0t0 6 /dev/pts/3
python 19858 jazzpi 1u CHR 136,3 0t0 6 /dev/pts/3
python 19858 jazzpi 2u CHR 136,3 0t0 6 /dev/pts/3
您可以看到它没有打开任何要写入的文件。另外,来自标签variable
的StackOverflow描述:
变量是内存中命名的数据存储位置。
但是,当您的计算机内存不足时,它可以将RAM的内容写入磁盘(即Windows上的pagefile.sys,Linux上的交换分区)。当您将操作系统发送到休眠模式时,通常也会发生这种情况。
- 如果输出非常大,这样做有风险吗?
写入交换是操作系统的最后手段,你应该尽量避免,因为从磁盘读取比从RAM读取要慢很多(另见Teach yourself programming in 10 years)。
- 什么是更安全的替代品?
因此,如果您正在处理大到足以可能溢出PC内存的巨大输出,则应考虑定期将该数据转储到磁盘上的临时文件中(例如,每10MB左右),如果可能的话。
如果您想从输出流中读取,我还建议您查看this。