Python 脚本 运行 双击时,但不会 运行 在空闲时

Python script runs when double-clicked, but won't run in IDLE

所以我一直在尝试编写一个简短的脚本来自动拉出 Unity3D 帮助页面(其中五个),以及 Unity 本身和 TortoiseHG。由于 webbrowser 模块没有按照我想要的方式运行(在我的 Win7 机器上),我一直在使用 subprocess.run.

昨晚,我以为我终于修复了这个问题并让它按照我的意愿运行,只是让它打开五个 windows 而不是标签,如果 Firefox 还没有 运行ning。我在 webbrowser.open 上遇到了同样的问题,去看看吧。

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

  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 进程 运行ning,这样它就不会为每个 subprocess.run 打开一个新的 window调用(如前所述,如果 Firefox 已经 运行ning,它们将在选项卡中打开)。我在尝试解决新问题时将其注释掉。

我已经尝试过的方法:寻找可能混淆导入的 .pyc 文件。找到 none。确保 none 我的方法或 classes 以 Python 模块命名——如您所见,没有任何方法或 class 定义,除非 Python 有一个模块叫做 GameDevEnvironment.py...找到任何明显相关的东西......

感谢您抽出时间提供帮助!

由于原始问题是 two-parter,这里有两个部分的答案(都在评论中)。

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

导致此问题的另一个问题是 subprocess.run() 打开多个 Firefox windows 如果还没有 Firefox 运行ning 实例。解决方案是在第一次和第二次调用 subprocess.run() 之间添加一个 time.sleep()。对我来说,八秒的时间足以让进程开始并允许第一页部分加载,这使得第二页加载速度更快。由于我的机器很旧,我最终在每个选项卡之间暂停了一次——它看起来顺畅多了,但它增加了 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')