如果存在';没有为python解释器打开终端/控制台窗口吗?
在Ubuntu桌面(Unity)下,当一个脚本被标记为可执行文件,然后我点击文件,我会得到弹出窗口,如图中所示: pyscript.py是一个可执行的Python脚本文件,带有shebang:如果存在';没有为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 这就提出了一个问题,后
#/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