Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从bash文件调用脚本时,iPython embed()会自动退出_Python_Python 2.7_Ipython - Fatal编程技术网

从bash文件调用脚本时,iPython embed()会自动退出

从bash文件调用脚本时,iPython embed()会自动退出,python,python-2.7,ipython,Python,Python 2.7,Ipython,我有一个要调试的数据处理管道设置。 管道由一个调用python脚本的bash脚本组成 我通常使用iPython的embed()函数进行调试。但是,当从bash文件调用python脚本时,调用了embed()函数,但立即退出,我无法干预。当直接从命令行运行同一个python程序时,我没有观察到这种行为。这是故意的行为还是我做错了什么 Python 2.7.6 (default, Oct 26 2016, 20:30:19) Type "copyright", "credits" or "licen

我有一个要调试的数据处理管道设置。 管道由一个调用python脚本的bash脚本组成

我通常使用iPython的embed()函数进行调试。但是,当从bash文件调用python脚本时,调用了embed()函数,但立即退出,我无法干预。当直接从命令行运行同一个python程序时,我没有观察到这种行为。这是故意的行为还是我做错了什么

Python 2.7.6 (default, Oct 26 2016, 20:30:19)
Type "copyright", "credits" or "license" for more information.

IPython 2.4.1 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]:
Do you really want to exit ([y]/n)?
'follow up code prints here'

我做了一些实验来观察这种行为。我注意到,如果任何祖先进程是终端进程,IPython都会显示控制台

以下是/tmp目录中的文件: x.py

import IPython 
IPython.embed()
call.sh

/usr/bin/python /tmp/x.py
/tmp/call.sh
/usr/bin/python /tmp/x.py &
call2.sh

/usr/bin/python /tmp/x.py
/tmp/call.sh
/usr/bin/python /tmp/x.py &
实验1 运行
pythonx.py
会打开ipythonshell并等待

实验2 运行
bash call.sh
还会打开IPython shell并等待

实验3 运行
bash call2.sh
也会打开IPython shell并等待

正如您所看到的,您的IPython.embed调用有多深并不重要。它总是启动交互式控制台并等待


让我们尝试一下,当我们分叉一个新的过程时,它是否也起作用

fork.sh

/usr/bin/python /tmp/x.py
/tmp/call.sh
/usr/bin/python /tmp/x.py &
实验4
在本例中,IPython shell启动但立即退出。请注意结尾处的&。它开始了一个不同的过程。在这种情况下,IPython无法访问终端,因此优雅地退出

我可以复制这样的问题:

# test.py
import IPython
import sys
print(sys.stdin.read())
IPython.embed()
with open('/dev/pts/16') as user_tty:
    sys.stdin=user_tty
    IPython.embed()
STDIN不是TTY,所以我认为IPython担心入站文本(通过管道)不会被用户输入。它不希望
foo
(来自我上面的示例)喷入IPython shell并执行意外操作

您可以通过通过
tty
命令获取终端id,并在完成从管道中的读取后将stdin重定向到调用终端来解决此问题,如下所示:

# test.py
import IPython
import sys
print(sys.stdin.read())
IPython.embed()
with open('/dev/pts/16') as user_tty:
    sys.stdin=user_tty
    IPython.embed()
有关TTY的更多信息,请参阅。还请注意,如果您在其中输入了错误的tty,则来自其他终端的输入将控制IPython

我不确定IPython是否可能知道调用tty的是什么,如果不是bash将其覆盖为管道的输出端的话


编辑:这里是我的解决方法,简单地说:

请发布Bash脚本和Python脚本中的相关代码。我无法通过制作一个运行调用
embed()
的Python脚本的bash脚本来重现这一点。