Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.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_Linux_Windows_Unix_Terminal - Fatal编程技术网

如果存在';没有为python解释器打开终端/控制台窗口吗?

如果存在';没有为python解释器打开终端/控制台窗口吗?,python,linux,windows,unix,terminal,Python,Linux,Windows,Unix,Terminal,在Ubuntu桌面(Unity)下,当一个脚本被标记为可执行文件,然后我点击文件,我会得到弹出窗口,如图中所示: pyscript.py是一个可执行的Python脚本文件,带有shebang:#/usr/bin/python其中/usr/bin/python是python解释器的路径。由于我没有在终端窗口中运行这个进程,因为我只是单击了“运行”,我认为最初这个进程没有标准流;当我进行更多试验时,我意识到所有标准流都可用: pyscript.py output.txt 这就提出了一个问题,后

在Ubuntu桌面(Unity)下,当一个脚本被标记为可执行文件,然后我点击文件,我会得到弹出窗口,如图中所示:

pyscript.py是一个可执行的Python脚本文件,带有shebang:
#/usr/bin/python
其中/usr/bin/python是python解释器的路径。由于我没有在终端窗口中运行这个进程,因为我只是单击了“运行”,我认为最初这个进程没有标准流;当我进行更多试验时,我意识到所有标准流都可用:

pyscript.py

output.txt


这就提出了一个问题,后台没有运行终端窗口,sys.stdout、stdin和stderr连接到什么?从技术上讲,在Windows下使用.pyw运行Python而不使用控制台窗口时,我会得到相同的输出

看看这个问题:

一个答复指出:

标准流
sys.stdin
sys.stdout
sys.stderr
不可用

当我在Windows 10中通过单击Windows注册表中的.pyw文件来测试Python 2.7时,标准流不可用的强调似乎并不正确。pyw文件与在我的计算机中运行pythonw.exe的Python 2.X相关联


这个问题是Unix/Windows的一堆乱七八糟的问题

正如其他人提到的,这个问题不是Python特有的。生成进程时,父进程有责任设置子进程的文件描述符(或允许继承它们)

因此,这甚至不是特定于操作系统的,而是特定于应用程序的。例如,对于Gnome和KDE,您可能有不同的anser。或者在Windows资源管理器或7-Zip中执行文件时(我想,我知道这在Unix上是如何工作的,但在Windows上不太确定)。生成流程的不同应用程序可能会做出不同的安排

在Linux上,您可以通过在python进程上运行
lsof
找到答案,该进程将列出打开的文件并告诉您stdout的确切位置。这是您的代码,更改为:

#!/usr/bin/env python

# vi: ai sts=4 sw=4 et

import sys, os, pprint
import subprocess

f = open("/tmp/output.txt", "w")

for stream in (sys.stdout, sys.stdin, sys.stderr):
    print (stream, file=f)
    print ("STTY?", stream.isatty(), file=f)
    print ("fileno:", stream.fileno(), file=f)
    print ("name:", stream.name, file=f)

#    print (pprint.pprint(dir(stream)), file=f)
    print (file=f)

subprocess.call ("lsof -p %s" % os.getpid(), stdout = f, shell = True)
只有最后一行才是真正重要的。请参阅正常运行的输出:

(...)
test.py 29722 xxx    0u   CHR  136,4      0t0      7 /dev/pts/4
test.py 29722 xxx    1u   CHR  136,4      0t0      7 /dev/pts/4
test.py 29722 xxx    2u   CHR  136,4      0t0      7 /dev/pts/4
将输出重定向到文件时:

(...)
test.py 29728 xxx    0u   CHR  136,4      0t0       7 /dev/pts/4
test.py 29728 xxx    1w   REG   0,38        0 2070222 /tmp/asdf.txt
test.py 29728 xxx    2u   CHR  136,4      0t0       7 /dev/pts/4
查看文件#1是否已更改?当你从Unity运行它时,也会发生同样的情况,告诉你这将走向何方


我没有完全重现您的问题,因为我的Gnome 3文件管理器不会运行这样的脚本,我也不会研究它,但我很想知道您的问题在哪里。

答案可能不会是任何特定于Python的。但它将特定于操作环境。您是在询问Windows还是Unity?您是否尝试过从这些流中阅读或写作?“发生了什么事?”罗布说ᵩ 我在问这两个问题。在从lightdm启动的Ubuntu 16.04中,对于通过窗口管理器运行的程序,stdin是
/dev/null
,stdout/stderr是一个伪终端客户端(
/dev/pts/[N]
)。它看起来像upstart(除了systemd之外仍然使用)有伪终端服务器fd(用于
/dev/ptmx
)。另外,upstart的stdout是
/dev/null
,我看不到写入客户机pts的输出被记录在任何地方。它认为它只是在默认配置中被丢弃了。
(...)
test.py 29722 xxx    0u   CHR  136,4      0t0      7 /dev/pts/4
test.py 29722 xxx    1u   CHR  136,4      0t0      7 /dev/pts/4
test.py 29722 xxx    2u   CHR  136,4      0t0      7 /dev/pts/4
(...)
test.py 29728 xxx    0u   CHR  136,4      0t0       7 /dev/pts/4
test.py 29728 xxx    1w   REG   0,38        0 2070222 /tmp/asdf.txt
test.py 29728 xxx    2u   CHR  136,4      0t0       7 /dev/pts/4