我想从shell中获取此行为:
$ python --new-session -c ''
$ python --use-session -c 'x = 42'
$ python --use-session -c 'print x'
42
为什么?
我正在使用命令行中的许多帮助程序,例如mako-render
和jinja
,为我的(C / C ++)项目生成文件。在每次调用Python时,所有使用过的模块都要导入工作区,这需要时间。通过在Python调用中使用持久工作区,我可以节省大量处理时间。
我目前的解决方案是使用shelve
存储我的会话之间的所有内容,但这不方便,我正在寻找一个不那么复杂的解决方案。
我知道使用Jupyter内核可以做些什么。不幸的是,在我的系统上启动连接到现有内核的新Python会话大约需要5到10秒。
答案 0 :(得分:2)
以下bash脚本是您需要的草稿近似值:
#!/usr/bin/env bash
if [[ $# -ne 1 ]]
then
echo 1>&2 "Usage: python-session <session-name>"
exit 1
fi
sessionname="$1"
sessiondir=/tmp/python-session."$sessionname"
stdin="$sessiondir/stdin"
stdout="$sessiondir/stdout"
endsession()
{
echo Exiting python session "$sessionname"
rm -rf "$sessiondir"
}
newsession()
(
echo "Starting new session $sessionname"
mkdir "$sessiondir"
trap "endsession" EXIT
touch "$stdin"
touch "$stdout"
tail -f "$stdin"|python -i -c "import sys; sys.ps1=sys.ps2=''">"$stdout"
)
if [ ! -d "$sessiondir" ]
then
newsession & disown
while [ ! -e "$stdout" ]; do sleep 0.01; done
fi
echo "Connected to python session $1 (leave the session by typing CTRL-D)"
tail -f -n 0 "$stdout"&
tailpid=$!
trap "kill $tailpid" EXIT
cat >> "$stdin"
$ ./python-session 1
Starting new session 1
Connected to python session 1 (leave the session by typing CTRL-D)
x=123
$ ./python-session 1
Connected to python session 1 (leave the session by typing CTRL-D)
print x
123
$ ./python-session 2
Starting new session 2
Connected to python session 2 (leave the session by typing CTRL-D)
print x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
x='abc'
$ ./python-session 1
Connected to python session 1 (leave the session by typing CTRL-D)
print x
123
$ ./python-session 2
Connected to python session 2 (leave the session by typing CTRL-D)
print x
abc
exit()
Exiting python session 2
$ ./python-session 1
Connected to python session 1 (leave the session by typing CTRL-D)
exit()
Exiting python session 1
$
您必须通过输入exit()
命令,然后输入其他(甚至为空)行来停止会话。之后你仍然必须点击 CTRL-D 才能与现在不存在的会话断开连接
python会话的标准错误流是不捕获