2016-08-28 5 views
0

Я написал небольшую программу на питоне, которая пишет сценарий C-оболочки, а затем вызывает сценарий с подпроцессом. Тем не менее, python не выполняет сценарий. Я протестировал это в терминале и обнаружил, что сценарий также не будет запущен с терминала (т. Е. Не проблема с python). Дальнейшее тестирование показало, что я могу написать идентичный скрипт в текстовом редакторе (vi), а затем успешно выполнить его с терминала (т. Е. Я не думаю, что содержимое скрипта виновато). В конце концов я обнаружил, что если бы я попытался запустить вывод из python непосредственно в терминале с ./myscript.com, он бы не бежать. Однако, если я открываю с помощью vi, make NO изменяет, сохраняет, а затем запускается с терминала с помощью ./myscript.com (т. Е. Точно такой же команды), который он выполнит. Скрипт включен ниже, в случае его использования, однако, большая часть содержимого очень специфична для конкретной программы, которую я пытаюсь запустить. Я не знаю, как отлаживать это дальше, или почему эффект открытия, сохранения и закрытия в vi достаточен, чтобы позволить сценарию быть выполненным. (Например, я проверил разрешения, и они не изменились после этапа vi.) Любые предложения о том, как действовать, что очень ценится.Запуск сценария оболочки из python

#!/bin/csh 
# 
bin2pipe -in /full/path/to/this/script/recon.spc -bad 0.0 -noswap \ 
-xN 1714 \ 
-xT 1714 \ 
-xFT Freq \ 
-xMODE Real \ 
-xSW 4184.570312 \ 
-xCAR 10.929523 \ 
-xOBS 800.130005 \ 
-xLAB 1H \ 
-yN 2048 \ 
-yT 2048 \ 
-yFT Freq \ 
-yMODE Real \ 
-ySW 1700.680054 \ 
-yCAR 125.728023 \ 
-yOBS 81.075996 \ 
-yLAB 1H \ 
-ndim 2 \ 
|nmrPipe -fn TP -auto \ 
|nmrPipe -fn REV \ 
|nmrPipe -fn TP -auto \ 
-out recon.spc.pipe.ft2 -ov -verb 
+0

Как вы это называете от Python? –

+0

Из python Я называю его как «subprocess.call (FileName)», предварительно установив права доступа к файлу, чтобы он исполнялся с помощью 'os.chmod (FileName, 0o755). Одна вещь, которую я заметил, это открытие, сохранение и закрытие vi добавляет 1 байт к размеру файла (от 492 до 493 байта). Я не знаю, является ли это значительным, или добавляется этот дополнительный байт. – 218

+1

Вы можете сравнить два байта файлов для байта и посмотреть, что другое. Являются ли эквивалент * новой строки *? Unicode против ascii? – wwii

ответ

0

В случае, если это полезно я использовал xxd (как это было предложено в вышеупомянутых комментариях, http://linuxcommand.org/man_pages/xxd1.html), чтобы преобразовать как файлы сценариев, один созданные в питон и один написанные вручную, чтобы проклясть

xxd script.txt output.txt 

I затем сравнил вывод для двух файлов с diff и мог видеть дополнительный символ 0a в шестнадцатеричном виде в конце файла. Это соответствует новой строке. Как подробно описано здесь Why should text files end with a newline? и здесь VIM Disable Automatic Newline At End Of File, vi добавляет символ новой строки в конце файла, если его нет. Это позволило запустить сценарий. Без символа новой строки в конце (который я не включил в скрипт python) скрипт не запускался.