Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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
.pyw和pythonw不在Windows 7下运行_Python_Python 2.7_Windows 7_Pythonw - Fatal编程技术网

.pyw和pythonw不在Windows 7下运行

.pyw和pythonw不在Windows 7下运行,python,python-2.7,windows-7,pythonw,Python,Python 2.7,Windows 7,Pythonw,运行简单的.py或.pyw python文件会导致任务管理器下显示python.exe python myApp.py python myApp.pyw 但是,当我们尝试在不使用控制台的情况下运行它时,脚本似乎不会运行,任务管理器下也不会出现python.exe或pythonw.exe pythonw myApp.pyw pythonw myApp.py 我们如何解决问题?系统正在运行Python 2.7.8 x64。我不确定我是否理解您的问题,但我认为这是您需要知道的 您需要右键单击py或

运行简单的.py或.pyw python文件会导致任务管理器下显示
python.exe

python myApp.py
python myApp.pyw
但是,当我们尝试在不使用控制台的情况下运行它时,脚本似乎不会运行,任务管理器下也不会出现
python.exe
pythonw.exe

pythonw myApp.pyw
pythonw myApp.py

我们如何解决问题?系统正在运行Python 2.7.8 x64。

我不确定我是否理解您的问题,但我认为这是您需要知道的

您需要右键单击py或pyw文件,然后选择“使用打开…”。。。查找python.exe(可能是C:\Python27\python.exe)。。选中“始终打开”的框。。。现在,如果您想运行它,只需双击它


(通常安装程序会为您设置…

尝试添加行
导入系统;sys.stderr=open(“errlog.txt”,“w”)
myApp.py
的开头。然后在
errlog.txt
中查找回溯或任何其他错误消息。

我自己的一个脚本也遇到了同样的问题,发现在添加Ross的答案的输出时,脚本实际上会运行

由于某种原因,重定向输出似乎解决了问题。由于我对将输出写入磁盘不感兴趣,因此我使用以下命令将其写入
/dev/null
(或同等平台):


if语句确保仅当脚本从
pythonw.exe
启动时才会发生。我不确定它是否相关,但在其他导入(包括
导入日志记录
)之前执行此操作很重要。

我遇到了类似的问题

在通过写入日志文件一步一步地调试之后,我发现pythonw.exe在尝试使用调用sys.stdout.write()的语句后崩溃。事实证明,当使用pythonw.exe运行时,sys.stdout是None

如果您正在使用sys.stdout/stderr/stdin的函数,并且打算将程序与pythonw.exe一起使用,那么添加一个“无”检查是一个好主意。

tl;dr

  • 要进行故障排除,请在调用时使用输出重定向:

    pythonw myApp.py 1>stdout.txt 2>stderr.txt
    
这将在文件
stdout.txt
中捕获stdout输出,例如来自
print()
,并在文件
stderr.txt
中捕获stderr输出(例如来自未处理的异常);从PowerShell中,使用
cmd/c pythonw myApp.py 1>stdout.txt 2>stderr.txt
)。
请注意,重定向stdout的行为实际上可能会使脚本再次工作,如果它在
pythonw
中失败的唯一原因是使用
print
(在python2.x中-见下文)。
警告:当直接调用
*.pyw
脚本时,这种输出重定向技术似乎不起作用(而不是通过将脚本文件路径传递到
pythonw.exe
)。如果您知道原因和/或它是否对您有效,请务必让我知道

  • 要修复脚本,请执行以下操作:
将以下内容放在要使用
pythonw.exe运行的任何Python 2.x或3.x脚本的顶部

import sys, os
if sys.executable.endswith("pythonw.exe"):
  sys.stdout = open(os.devnull, "w");
  sys.stderr = open(os.path.join(os.getenv("TEMP"), "stderr-"+os.path.basename(sys.argv[0])), "w")
当使用
pythonw.exe运行脚本时,这确保了以下几点:

  • print()
    调用和对
    sys.stdout()
    的显式调用实际上被忽略(没有操作)
  • Stderr输出,包括来自未处理的致命异常的输出,被发送到文件
    %TEMP%\stderr-
    %TEMP%
    是一个标准的Windows环境变量,它指向当前用户的临时文件文件夹
换句话说:在上述代码就绪的情况下,在使用
pythonw.exe调用脚本时,在脚本以静默方式失败后,检查文件
%TEMP%\stderr-

有关解释,请继续阅读


在Windows上,
pythonw.exe
用于在所有脚本上启动GUI/无UI,这意味着 标准输入和输出流--
sys.stdin
sys.stdout
sys.stderr
不可用。

这有两个严重的副作用:

import sys, os
if sys.executable.endswith("pythonw.exe"):
  sys.stdout = open(os.devnull, "w");
  sys.stderr = open(os.path.join(os.getenv("TEMP"), "stderr-"+os.path.basename(sys.argv[0])), "w")
  • 使用
    print()
    -默认情况下,它以
    sys.stdout
    为目标-会导致Python 2.x中出现异常。
    • 这个问题在Python3.x中已经修复
  • 任何未处理的异常-包括由2.x中的
    print()
    触发的异常-会导致脚本以静默方式中止
    • 默认情况下,异常错误消息会转到
      sys.stderr
      ,这正是本场景中不可用的
上述代码通过以下方式修复了这些问题:

  • 将标准输出发送到空设备,有效地忽略任何试图通过
    print()
    显式或隐式输出到
    sys.stdout

  • 将所有stderr输出发送到临时文件


Python2.x和Python3.x之间的区别:

使用
pythonw.exe
sys.stdin
sys.stdout
sys.stderr
运行脚本时:

  • Python中的2.x:具有无效的文件描述符
    • 尝试写入
      sys.stdout
      sys.stderr
      时的最终结果是以下异常:
      IOError:[Errno 9]错误的文件描述符
    • 陷阱:由于输出缓冲,在输出(比如4K字节)之前,此异常可能不会出现;通过使用
      -u
      (用于无缓冲输出)调用
      pythonw.exe
      ,可以立即触发它
    • print()
      盲目尝试
      sys.stdout
      (默认情况下),因此迟早会引发此异常
  • 在Python中3.x:是否设置为
    None
    • 这是由3.x
      print()
      函数perform()补充的
      cd E:\my\script\folder\
      pythonw script.py