WedX - журнал о программировании и компьютерных науках

Python не выполняет скрипт

Я написал код Python для создания сценария оболочки, а затем запустил сценарий с помощью подпроцесса.

Файл сценария создается, но когда я пытаюсь запустить его из кода, он ничего не делает. Если я попытаюсь запустить тот же сценарий с файлом, созданным вне сценария, он будет работать, как и ожидалось.

Вот мой код:

import subprocess
import os

cwd = os.getcwd()
file_name = cwd + "/cmd_file_from_python"
fd = open(file_name,"w")
fd.write("#!/usr/local/bin/tcsh -f\n")
fd.write("echo 'PRINT FROM CMD_FILE_FROM_PYTHON'\n")
fd.close

os.chmod(file_name, 0o777)

cmd=file_name
p = subprocess.Popen(cmd,executable='/bin/ksh', shell=True, stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
(stdout,stderr) = p.communicate()
p_status = p.wait()
print "Command output : ", stdout
print "Command outerr : ", stderr
print "Command exit status/return code : ", p_status
print "================================================================"

file_name = cwd + "/cmd_file"
cmd = file_name
p = subprocess.Popen(cmd,executable='/bin/ksh', shell=True, stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
(stdout,stderr) = p.communicate()
p_status = p.wait()
print "Command output : ", stdout
print "Command outerr : ", stderr
print "Command exit status/return code : ", p_status

и вывод:

Command output :
Command outerr :
Command exit status/return code :  0
================================================================
Command output :  PRINT FROM CMD_FILE

Command outerr :
Command exit status/return code :  0

Вот код скрипта, который я создал вне кода:

$ cat cmd_file
#!/usr/local/bin/tcsh -f
echo 'PRINT FROM CMD_FILE'

ЕСЛИ я проверяю оба файла, разница только в печати:

$ diff cmd_file_from_python cmd_file
2c2
< echo 'PRINT FROM CMD_FILE_FROM_PYTHON'
---
> echo 'PRINT FROM CMD_FILE'
17.01.2019

  • Боковое примечание: почему вы явно указываете executable='/bin/ksh', когда запускаете сценарии со строками shebang, которые указывают tcsh. Это кажется бессмысленным, когда исполняемый файл по умолчанию отлично запускает скрипт tcsh. Также не похоже, что здесь есть какая-либо причина использовать shell=True, поскольку вы не передаете строку с аргументами и не выполняете какие-либо действия, связанные с оболочкой, в команде. shell=True открывает дыры в безопасности/стабильности без всякой причины. 17.01.2019
  • Я сожалею, что у меня есть только один голос, чтобы отдать комментарий ShadowRanger. Вздох. Единственное, что у меня есть, почему кто-то может это сделать, так это потому, что он делает это как пробный тест, чтобы подготовиться к большей ошибке. Просто вызовите сценарий, который вы создали, вместо того, чтобы вызывать прокси-сервер, чтобы он запустил его для вас. 17.01.2019

Ответы:


1

Ваш файл пуст, пока программа работает:

fd = open(file_name,"w")
fd.write("#!/usr/local/bin/tcsh -f\n")
fd.write("echo 'PRINT FROM CMD_FILE_FROM_PYTHON'\n")
fd.close

Обратите внимание на отсутствие скобок вызова в fd.close; вы на самом деле никогда не закрывали файл, поэтому все содержимое файла, вероятно, находилось в буфере Python и никогда не попадало на диск до завершения программы (когда эталонный интерпретатор CPython, как деталь реализации, проходит и очищает глобальные переменные, закрывая открытые файлы для вас побочным эффектом; он может никогда не добраться до диска в другом интерпретаторе).

Чтобы исправить, вызовите close. Или, что еще лучше, переключитесь на гораздо более безопасный подход withstatement, где close является неявным и автоматическим, возникающим, даже если исключение или return заставят вас выйти из кода раньше:

with open(file_name, "w") as fd:
    fd.write("#!/usr/local/bin/tcsh -f\n")
    fd.write("echo 'PRINT FROM CMD_FILE_FROM_PYTHON'\n")
# No need to call close; file is guaranteed closed when you exit with block
17.01.2019
  • Я в замешательстве ... Почему предложенный вами ответ не включает в себя исправление чепухи оболочки, которую вы упомянули в своем комментарии? 17.01.2019
  • @EdGrimm: Потому что ерунда с оболочкой вовсе не является причиной проблемы ОП. Это бессмысленный и плохой код, но не связанный с проблемой; источников более чем достаточно, почему это проблема и как ее исправить. 17.01.2019
  • Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]