我的目标是实现一个小的Python书面脚本,以使我更轻松地处理Jupyter。
因此我编写了此脚本:
import signal
import socket
import subprocess
import sys
sp = None
port = 8888
def get_own_ip():
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
s.connect(('1.1.1.1', 1))
IP = s.getsockname()[0]
except:
IP = '127.0.0.1'
finally:
s.close()
return IP
def signal_handler(sig, frame):
# terminates Jupyter by sending two SIGINTs to it
if sp is not None:
# send termination to jupyter
sp.send_signal(signal.SIGINT)
sp.send_signal(signal.SIGINT)
sys.exit(0)
if __name__ == "__main__":
own_ip = get_own_ip()
sp = subprocess.Popen(["jupyter-notebook"
, "--ip='%s'" % own_ip
, "--port=%i" % port
, "--no-browser"],
stdout=subprocess.PIPE,
stdin=subprocess.PIPE,
bufsize=1)
print(sp)
signal.signal(signal.SIGINT, signal_handler)
with sp.stdout:
print('read')
for line in sp.stdout.readline():
print('line: %s' % line)
print('wait')
sp.wait() # wait for the subprocess to exit
首先,我检索我的IP地址,以将其用作Jupyter的参数。然后我运行Jupyter,然后我想在Jupyter运行时过滤Jupyter(stdout
)的一些输出。但是,似乎sp.stdout.readline()
处于阻止状态。
上面的代码向终端产生以下输出:
/usr/bin/python3.6 /home/alex/.scripts/get_own_ip.py
<subprocess.Popen object at 0x7fa956374240>
read
[I 22:43:31.611 NotebookApp] Serving notebooks from local directory: /home/alex/.scripts
[I 22:43:31.611 NotebookApp] The Jupyter Notebook is running at:
[I 22:43:31.611 NotebookApp] http://192.168.18.32:8888/?token=c4b7784d784206fc357b8f484b8d659fed6a2b1733b46ae6
[I 22:43:31.611 NotebookApp] or http://127.0.0.1:8888/?token=c4b7784d784206fc357b8f484b8d659fed6a2b1733b46ae6
[I 22:43:31.611 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 22:43:31.614 NotebookApp]
To access the notebook, open this file in a browser:
file:///home/alex/.local/share/jupyter/runtime/nbserver-18280-open.html
Or copy and paste one of these URLs:
http://192.168.18.32:8888/?token=c4b7784d784206fc357b8f484b8d659fed6a2b1733b46ae6
or http://127.0.0.1:8888/?token=c4b7784d784206fc357b8f484b8d659fed6a2b1733b46ae6
您可以看到发生了输出,但不会被sp.stdout.readline()
识别。
如何正确地从sp.stdout
流式播放?
我认为这些消息是写到stderr而不是stdout的。因此,您需要改用sp.stderr
。
您可以在shell中运行它(如果您使用的是Linux,可以测试这种情况:
jupyter notebook > stdout.log 2> stderr.log