Команда оболочки работает только если выполняется вручную, но не из файла Python - PullRequest
1 голос
/ 21 апреля 2019

У меня VPS под управлением Ubuntu 16.04, и я использую Python для автоматизации некоторых задач. Я написал простой скрипт, который создает несколько пользователей одновременно, используя команду newusers. newusers читает файл, содержащий данные пользователей, и создает новых пользователей на основе этих данных. Сначала я создаю файл с именем users.txt, в который я помещаю все пользовательские данные. После этого я вызываю newusers для этого файла позже в моем скрипте, чтобы фактически сделать пользователей.

Я попытался использовать модуль os и subprocess для вызова команды sudo newusers users.txt, однако оба не работали. Команда, однако, работает, когда я запускаю ее непосредственно из командной строки.

Здесь я попытался выполнить команду, используя подпроцесс:

create_users = subprocess.Popen(['sudo', 'newusers', 'users.txt'], shell=True)

Здесь я попробовал использовать os:

os.system('sudo newusers users.txt')

Я даже пытался создать внешний файл, который затем вызвал бы команду:

make_users = open('make_users.py', 'x')

make_users.write('#!/usr/bin/env python3\n\n\
import os\n\n\
os.system(\'sudo newusers users.txt\')')

os.system('python3 make_users.py')

Это - ссылка на весь код.

Проблема в том, что когда я запускаю sudo newusers users.txt вручную (непосредственно из командной строки), команда работает отлично. Единственный раз, когда он не работает, это когда я запускаю его из скрипта Python.

Я думал, что, возможно, сценарий должен успешно завершиться, прежде чем я смогу запустить sudo newusers users.txt

Я не получаю никакой ошибки, на самом деле вывод подпроцесса - None. Но когда я проверяю /etc/passwd, пользователи не создаются.

Конечно, я мог бы просто запустить скрипт (который бы создал users.txt), а затем просто запустить sudo newusers users.txt прямо из командной строки, но я хочу понять, в чем проблема и почему я не могу выполнить ту же команду, используя Python.

PS: Права доступа не являются проблемой, поскольку я являюсь пользователем root.

Буду признателен за любую помощь!

1 Ответ

0 голосов
/ 02 мая 2019

Нашел проблему.Когда я создал файл users.txt, я не закрывал его.Как упоминалось в этом видео: https://www.youtube.com/watch?v=iba-I4CrmyA&t=487s, закрытие файла будет: «возвращать дескриптор файла (ресурс) обратно в операционную систему».Это была глупая ошибка, которую я больше не буду повторять.Теперь я всегда использую оператор with.

Спасибо, @Reductio и @Davis Herring за вашу помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...