【问题标题】:Python script runs when double-clicked, but won't run in IDLEPython 脚本在双击时运行,但不会在 IDLE 中运行
【发布时间】:2017-01-20 19:15:56
【问题描述】:

所以我一直在尝试编写一个简短的脚本来自动提取 Unity3D 帮助页面(其中五个),以及 Unity 本身和 TortoiseHG。由于 webbrowser 模块的行为不是我想要的(在我的 Win7 机器上),我一直在使用 subprocess.run。

昨晚,我以为我终于修好了这个东西,让它做我想做的事,但如果 Firefox 还没有运行,它只打开五个窗口而不是标签。我在使用 webbrowser.open 时遇到了同样的问题,请看图。

但这不是我来这里的原因。我在这里是因为当我使用 IDLE 打开脚本以尝试修复 that 问题时,我遇到了一个新问题:如果我双击它,脚本会运行得很好,但如果我尝试用 F5 通过 IDLE 运行它我得到 ​​p>

  Traceback (most recent call last):
  File "C:\Users\<me>\AppData\Local\Programs\Python\Python35-32\GameDevEnvironment.py", line 5, in <module>
    subprocess.run(r'start firefox -new-tab https://unity3d.com/learn/tutorials', shell=True)
AttributeError: 'module' object has no attribute 'run'

我的完整代码:

import os
import subprocess
#import time

subprocess.run(r'start firefox -new-tab https://unity3d.com/learn/tutorials', shell=True)

#time.sleep(5)

subprocess.run(r'start firefox -new-tab https://answers.unity3d.com', shell=True)

subprocess.run(r'start firefox -new-tab https://unity3d.com/learn/tutorials/topics/scripting', shell=True)

subprocess.run(r'start firefox -new-tab https://docs.unity3d.com/Manual/index.html', shell=True)

subprocess.run(r'start firefox -new-tab https://docs.unity3d.com/ScriptReference/index.html', shell=True)

#os.startfile(r'C:\Program Files\Unity\Editor\Unity.exe')

#os.startfile(r'C:\Program Files\TortoiseHg\thgw.exe')

我打算尝试使用 time.sleep 方法让 Firefox 进程运行,这样它就不会为每个 subprocess.run 调用打开一个新窗口(如前所述,如果 Firefox 是,它们将在选项卡中打开已经运行)。我在尝试解决新问题时将其注释掉。

我已经尝试过:寻找一个可能会混淆导入的 .pyc 文件。没有找到。确保我的方法或类都不是以 Python 模块命名的——如您所见,没有任何方法或类定义,除非 Python 有一个名为 GameDevEnvironment.py 的模块......我在这里发现了很多问题并且其他人在 IDLE 中运行的相反问题不是双击等,但找不到任何明显相关的东西......

感谢您的宝贵时间和帮助!

【问题讨论】:

  • 我怀疑 IDLE 使用与双击不同的 python 安装。可以加import sys/print(sys.version)确认吗?
  • subprocess.run 在 python 3.5 中是新的。按照建议,检查您的 python 版本。
  • 这确实是问题所在。我觉得我应该知道 :p 谢谢,伙计们!
  • 请将您找到的解决方案作为正确答案发布。
  • 它很可能在不同的窗口中打开,因为当程序启动时,每个子进程都会检查是否有一个 firefox 窗口打开。由于没有,每个进程大致同时打开一个新的 Firefox 窗口。如果在第一个和第二个 subprocess.run() 调用之间有一个 sleep(),你可能会得到预期的结果。

标签: python subprocess python-idle


【解决方案1】:

由于原始问题是两部分的,因此这里是一个两部分的答案(两者也在 cmets 中)。

我无法从 IDLE 运行脚本的原因是 shell 版本比我编写的代码旧。基本上,在 Python 3.2 中不存在 Subprocess 类。当我卸载 Python32 以确保我可以在 Python35 中打开时,问题就解决了。

导致这个问题的另一个问题是 subprocess.run() 在没有 Firefox 实例运行的情况下打开几个 Firefox 窗口。解决方案是在对 subprocess.run() 的第一次和第二次调用之间添加 time.sleep()。对我来说,8 秒是启动进程并允许第一页部分加载的好时间,这使得第二页加载速度更快。由于我的机器很旧,我最终在每个选项卡之间设置了一个睡眠 - 它看起来更流畅,但它增加了 20 秒的过程;不是很优雅。

如果您来到这里寻找一种无需使用 Selenium 即可获得结果的方法,我的建议是:使用 Selenium。我敢肯定,如果我刚刚下载并学习了它,它会节省我的时间和挫败感。

完成的代码(因为我的帐户是新的,所以不得不断开链接):

import os
import subprocess
import time

os.startfile(r'C:\Program Files\Mozilla Thunderbird\thunderbird.exe')

subprocess.run(r'start firefox -new-tab unity3d[breaking link]/learn/tutorials', shell=True)

time.sleep(8)

subprocess.run(r'start firefox -new-tab answers.unity3d[breaking link]', shell=True)

time.sleep(3)

subprocess.run(r'start firefox -new-tab unity3d[breaking link]/learn/tutorials/topics/scripting', shell=True)

time.sleep(3)

subprocess.run(r'start firefox -new-tab docs.unity3d[breaking link]/Manual/index.html', shell=True)

time.sleep(3)

subprocess.run(r'start firefox -new-tab docs.unity3d.[breaking link]/ScriptReference/index.html', shell=True)

time.sleep(3)

os.startfile(r'C:\Program Files\TortoiseHg\thgw.exe')

os.startfile(r'C:\Program Files\Unity\Editor\Unity.exe')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多