2017-01-20 2 views
0

Итак, я пытаюсь написать короткий скрипт, который автоматизирует подтягивание страниц справки Unity3D (пять из них), а также самого Unity и TortoiseHG , Поскольку модуль webbrowser не вел себя так, как я хотел (в моем окне Win7), я использовал subprocess.run.Сценарий Python запускается при двойном щелчке, но не запускается в IDLE

Прошлой ночью, я подумал, что, наконец, исправил эту вещь и сделал все, что хотел, только чтобы открыть пять окон вместо вкладок, если Firefox еще не запущен. Тот же вопрос, который у меня был с webbrowser.open, иди цифрой.

Но это не потому, что я здесь. Я здесь, потому что, когда я открыл скрипт с IDLE, чтобы попытаться исправить , что проблема, я столкнулся с новой проблемой: скрипт будет работать нормально, если я дважды нажму на него, но если я попытаюсь запустить его через IDLE с F5 я

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, не на двойном щелчке и т. д., но не смогли найти ничего, что явно важно ...

Я ценю ваше время и помощь!

+3

Я подозреваю, что IDLE использует другую установку питона, чем двойной щелчок делает. Можете ли вы добавить 'import sys' /' print (sys.version) 'для подтверждения? –

+3

'subprocess.run' является новым в python 3.5. Как и было предложено, проверьте версию python. – tdelaney

+0

Это действительно проблема. Я чувствую, что должен был знать: p Спасибо, ребята! – pyansharp

ответ

0

Поскольку исходный вопрос является двухпараторным, вот ответ на две части (оба они также в комментариях).

Причина, по которой я не мог запустить скрипт из IDLE, заключалась в том, что версия оболочки была старше кода, который я написал. В принципе, в Python 3.2 класс Subprocess не существовал. Когда я удалил Python32, чтобы я мог только, открытый в Python35, проблема была решена.

Другая проблема, которая привела к этой проблеме, была subprocess.run(), открывая несколько окон Firefox, если еще не было экземпляра Firefox. Решением было добавить time.sleep() между первым и вторым вызовами subprocess.run(). Для меня восемь секунд было хорошим временем для процесса, чтобы начать работу и разрешить загрузку первой страницы, что ускорило загрузку второй страницы. Поскольку моя машина устарела, я закончил тем, что спал между каждой вкладкой - она ​​выглядит намного гладко, но она добавляет двадцать секунд к процессу; не очень элегантный.

Если вы приземлились здесь, чтобы найти способ получить результаты без получения Селена, мой совет: получите Селен. Я почти уверен, что это спасло бы время и разочарование, если бы я только что скачал и узнал об этом.

Готовый код (должен был разорвать связь, потому что мой счет новый):

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')