Это - хороший стиль для вызова команд удара в рамках сценария Python с помощью os.system (“код удара”)? [закрытый]

8
задан JoeB 13 August 2010 в 07:35
поделиться

7 ответов

Прежде всего, в вашем примере используется mv, которая является программой в coreutils, а не в bash.

Использование вызовов os.system() для внешних программ считается плохим стилем, потому что:

  • Вы создаете зависимости от платформы
  • Вы создаете зависимости от версии (Да, даже coreutils иногда меняется!)
  • Вам нужно проверить существование внешних команд (и что они находятся в $PATH, и исполняются пользователем и т.д.)
  • Вы должны обернуть команды с проверкой ошибок, используя их код возврата. Гораздо приятнее использовать внутриязыковые коды ошибок или исключения. (os.system() не позволяет вам разбирать stdout/stderr)
  • Вам придется самостоятельно разбираться с цитированием переменных с пробелами (или их экранированием)
  • Python уже сделал эту работу за вас, предоставив библиотеки!

Поищите glob, для сопоставления шаблонов (globbing), подобно shell, и shutil, как уже упоминали другие. В остальном, все, что вам нужно, уже есть в стандартных библиотеках.

import glob
import shutil

for extfile in glob.glob('*.ext'):
    shutil.move(extfile,dest)  

Кроме того, os.system() не следует использовать - вместо него посмотрите на модуль subprocess.

17
ответ дан 3 November 2019 в 13:35
поделиться

Некоторые причины, по которым вам следует использовать чистый Python,

  1. Используя Python, вы уже сделали предположение, что Python и стандартные библиотеки установлены. Используя код Bash внутри Python, вы делаете это предположение плюс предположение, что Bash установлен и находится на системном пути.
  2. Используя комбинацию двух языков, вы усложняете чтение кода другим пользователям (не все знают Python и Bash).
  3. Если вы сделаете это так, как Python, это будет более естественно скоро - меньше строк кода не всегда лучше

В этом случае я бы использовал ...

import os
for filename in os.listdir('.'):
  if filename.endswith('.ext'):
    os.rename(filename, os.path.join('path', 'to', 'new', 'destination', filename))

Но могут быть способы получше

2
ответ дан 3 November 2019 в 13:35
поделиться

В общем, Python предоставляет модуль «подпроцесс», который позволяет вы можете запускать команды и осуществлять полный контроль над их выводом. Он позволяет вам «создавать новые процессы, подключаться к их каналам ввода / вывода / ошибок и получать их коды возврата»:

http://docs.python.org/library/subprocess.html

0
ответ дан 3 November 2019 в 13:35
поделиться

Всегда лучше и лучше использовать функции Python для выполнения подобных задач. С Python не так сложно написать сценарий независимо от ОС вместо использования bash.

3
ответ дан 3 November 2019 в 13:35
поделиться

Ознакомьтесь с модулем Python shutil . Он предлагает операции с файловой системой, такие как перемещение файлов. Между этим и модулем os у вас должны быть все необходимые инструменты. Это предпочтительнее команд bash по причинам, о которых говорили другие.

6
ответ дан 3 November 2019 в 13:35
поделиться

Это не идея, поскольку это делает ваш сценарий гораздо менее переносимым. Родной скрипт python может выполняться на любой машине unix или windows, на которой установлены соответствующие библиотеки python. Когда вы добавляете команды оболочки в смесь, вы нарушаете это, и внезапно оказываетесь заперты в гораздо более узком подмножестве.

Иногда у вас нет выбора, но если это что-то настолько простое, как это, написание кода на родном языке python будет иметь гораздо больше смысла, а также будет быстрее загружаться (поскольку процессу python не придется порождать новый shell только для выполнения одной команды).

1
ответ дан 3 November 2019 в 13:35
поделиться

Одни проблемы с цитированием говорят о том, что решение на чистом Python предпочтительнее.

1
ответ дан 3 November 2019 в 13:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: