Ви можете зателефонувати їм через os.system
, що працює, але ...
Escaping: os.system
працює лише з іменами файлів, які не мають пробілів або інших метахарактерів оболонки в імені шляху (наприклад A:\abc\def\a.txt
), інакше їх потрібно уникнути. Існує shlex.quote
для Unix-подібних систем, але насправді нічого не є стандартним для Windows. Можливо, дивіться також python, windows: розбір командних рядків shlex
- MacOS / X:
os.system("open " + shlex.quote(filename))
- Windows:
os.system("start " + filename)
там, де правильно filename
слід говорити, слід також уникати.
Ви також можете зателефонувати їм через subprocess
модуль, але ...
Для Python 2.7 і новіших просто використовуйте
subprocess.check_call(['open', filename])
У Python 3.5+ ви можете рівномірно використовувати трохи складніший, але також дещо більш універсальний
subprocess.run(['open', filename], check=True)
Якщо вам потрібно бути сумісним на всьому шляху до Python 2.4, ви можете використовувати subprocess.call()
та впроваджувати власну перевірку помилок:
try:
retcode = subprocess.call("open " + filename, shell=True)
if retcode < 0:
print >>sys.stderr, "Child was terminated by signal", -retcode
else:
print >>sys.stderr, "Child returned", retcode
except OSError, e:
print >>sys.stderr, "Execution failed:", e
Тепер, які переваги використання subprocess
?
- Безпека: Теоретично це більш безпечно, але насправді нам потрібно виконувати командний рядок так чи інакше; в будь-якому середовищі нам потрібне середовище та служби для інтерпретації, отримання шляхів тощо. У жодному випадку ми не виконуємо довільний текст, тому він не має вродженої проблеми "але ви можете ввести
'filename ; rm -rf /'
" проблему, і якщо ім'я файлу може бути пошкоджено, використовуючиsubprocess.call
дає нам небагато додаткового захисту.
- Поводження з помилками : насправді це не дає нам більше виявлення помилок, ми все ще залежно від того і
retcode
в іншому випадку; але поведінка явно створювати виняток у випадку помилки, безумовно, допоможе вам помітити, якщо стався збій (хоча в деяких сценаріях прослідкування може не бути кориснішим, ніж просто ігнорувати помилку).
- Породжує (не блокуючий) підпроцес : нам не потрібно чекати дочірнього процесу, оскільки ми за допомогою постановки проблеми починаємо окремий процес.
На заперечення "Але subprocess
переважніше". Однак os.system()
це не застаріло, і це в деякому сенсі найпростіший інструмент для цієї конкретної роботи. Висновок: використання os.system()
, отже, також є правильною відповіддю.
Помітний недолік полягає в тому, що start
команда Windows вимагає пройти, в shell=True
якому заперечується більшість переваг використання subprocess
.