Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.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
Python 解释器交互模式的目的是保持文件打开_Python_Python 2.7_Interpreter - Fatal编程技术网

Python 解释器交互模式的目的是保持文件打开

Python 解释器交互模式的目的是保持文件打开,python,python-2.7,interpreter,Python,Python 2.7,Interpreter,如果代码作为脚本运行: $ cat open_sleep.py import time open("/tmp/test") time.sleep(1000) $ python open_sleep.py 或者我在没有交互模式的情况下执行此操作: $ python -c 'import time;open("/tmp/test");time.sleep(1000)' 没有文件保持打开状态: $ ls -la /proc/`pgrep python`/fd total 0 dr-x---

如果代码作为脚本运行:

$ cat open_sleep.py 
import time
open("/tmp/test")
time.sleep(1000)

$ python open_sleep.py 
或者我在没有交互模式的情况下执行此操作:

$ python -c 'import time;open("/tmp/test");time.sleep(1000)' 
没有文件保持打开状态:

$ ls -la /proc/`pgrep python`/fd
total 0
dr-x------. 2 ack0hole ack0hole  0 Aug 30 14:19 .
dr-xr-xr-x. 8 ack0hole ack0hole  0 Aug 30 14:19 ..
lrwx------. 1 ack0hole ack0hole 64 Aug 30 14:19 0 -> /dev/pts/2
lrwx------. 1 ack0hole ack0hole 64 Aug 30 14:19 1 -> /dev/pts/2
lrwx------. 1 ack0hole ack0hole 64 Aug 30 14:19 2 -> /dev/pts/2
$ 
$ ls -la /proc/`pgrep python`/fd
total 0
dr-x------. 2 ack0hole ack0hole  0 Aug 30 14:16 .
dr-xr-xr-x. 8 ack0hole ack0hole  0 Aug 30 14:16 ..
lrwx------. 1 ack0hole ack0hole 64 Aug 30 14:16 0 -> /dev/pts/4
lrwx------. 1 ack0hole ack0hole 64 Aug 30 14:16 1 -> /dev/pts/4
lrwx------. 1 ack0hole ack0hole 64 Aug 30 14:16 2 -> /dev/pts/4
lr-x------. 1 ack0hole ack0hole 64 Aug 30 14:17 3 -> /tmp/test
$ 
除非我通过
open()
分配变量return:

$ cat open_sleep.py 
import time
o = open("/tmp/test")
time.sleep(1000)

$ python open_sleep.py 

OR

$ python -c 'import time;o=open("/tmp/test");time.sleep(1000)' 
T当文件将继续打开时::

$ ls -la /proc/`pgrep python`/fd
total 0
dr-x------. 2 ack0hole ack0hole  0 Aug 30 14:21 .
dr-xr-xr-x. 8 ack0hole ack0hole  0 Aug 30 14:21 ..
lrwx------. 1 ack0hole ack0hole 64 Aug 30 14:21 0 -> /dev/pts/2
lrwx------. 1 ack0hole ack0hole 64 Aug 30 14:21 1 -> /dev/pts/2
lrwx------. 1 ack0hole ack0hole 64 Aug 30 14:21 2 -> /dev/pts/2
lr-x------. 1 ack0hole ack0hole 64 Aug 30 14:21 3 -> /tmp/test
$ 
但交互模式并非如此,即使我没有将变量赋值给open():

如果压痕失败:

>>>     import time;open("/tmp/test");time.sleep(1000)
  File "<stdin>", line 1
    import time;open("/tmp/test");time.sleep(1000)
    ^
IndentationError: unexpected indent
>>> 
我有两个问题:

  • 即使打开(文件)未指定返回值,解释器交互模式保持文件打开的目的是什么?如果目的是调试目的,是否有此调试的示例

  • 为什么解释器交互模式打开文件时首先会出现缩进错误呢

  • 根据评论,我想说的是,我总是尝试使用新的交互模式会话,甚至尝试使用不同的终端(例如xterm),但这确实会引起缩进错误

    在示例中看不到打开的文件的原因是,打开文件后,
    文件
    对象的引用计数下降到0,因为结果未分配给变量,因此文件立即关闭

    在交互模式下不会发生这种情况的原因是,当第二个
    sleep
    函数运行时,对文件对象的引用保留在
    变量中,因此文件保持打开状态

    有关
    特殊变量的讨论,请参阅


    至于问题2,这是不可能发生的。你的支票一定弄错了。如果代码引发缩进错误,则不会运行任何操作。

    谢谢您的回答。问题2,我的意思是我故意在提示符>>>和代码之间留空,这样就会引发缩进错误。我不相信这只会发生在我的解释器交互模式下,而不是你的模式。如果你启动一个干净的交互会话,然后写下引起IndentationError的那行,那么就不会打开任何文件@林果皞: 套接字可以是任何东西,包括为帮助事后调试刚刚引发的异常而安装的交互式调试器(可能带有IDE)。
    >>>     import time;open("/tmp/test");time.sleep(1000)
      File "<stdin>", line 1
        import time;open("/tmp/test");time.sleep(1000)
        ^
    IndentationError: unexpected indent
    >>> 
    
    $ ls -la /proc/`pgrep python`/fd
    total 0
    dr-x------. 2 ack0hole ack0hole  0 Aug 30 14:38 .
    dr-xr-xr-x. 8 ack0hole ack0hole  0 Aug 30 14:38 ..
    lrwx------. 1 ack0hole ack0hole 64 Aug 30 14:38 0 -> /dev/pts/2
    lrwx------. 1 ack0hole ack0hole 64 Aug 30 14:38 1 -> /dev/pts/2
    lrwx------. 1 ack0hole ack0hole 64 Aug 30 14:38 2 -> /dev/pts/2
    lrwx------. 1 ack0hole ack0hole 64 Aug 30 14:38 3 -> socket:[411151]