2013-11-28 3 views
0

У меня есть скрипт bash, который помогает установить локальный SimpleHTTPServer.Python запускает скрипт bash и генерирует OSError

python -m SimpleHTTPServer 8080 

Я разместил это внутри моей папки проекта. В то время как я бегу программу с помощью:

subprocess.call('./setup.sh') 

сообщение об ошибке выходит:

Traceback (most recent call last): 
    File "test.py", line 2, in <module> 
    subprocess.call('./setup.sh') 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 522, in call 
    return Popen(*popenargs, **kwargs).wait() 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 709, in __init__ 
    errread, errwrite) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1326, in _execute_child 
    raise child_exception 
OSError: [Errno 13] Permission denied 

Я повторен это в терминале

localhost:Desktop XXXX$ sh setup.sh 
Serving HTTP on 0.0.0.0 port 8080 ... 

Это работает отлично. Я помню, что несколько раз, когда терминал выскочил в окно, спросите меня о разрешении на python о чем-то, связанном с брандмауэром, и я разрешил его. Вы можете мне помочь?

+0

Вы, вероятно, нужно установить экс ecutable bit на 'setup.sh'. – devnull

+0

Запустите его как root (sudo) – Dan

ответ

2

Run это именно так, как вы бы на оболочке, то есть, как и sh ./setup.sh:

subprocess.call('sh ./setup.sh', shell=True) 

Это должно сделать трюк. Скорее всего, ваш setup.sh не установлен в исполняемый файл или отсутствует первая строка #!, которая отмечает его интерпретатор.

EDIT:

Обязательно установите shell=True, чтобы выполнить его с помощью оболочки, если вы передаете его в виде одной строки, или отдельные параметры в списке, как можно было бы с execve:

subprocess.call(['sh', './setup.sh']) 
+0

Я пробовал, но он говорит OSError: [Errno 2] Нет такого файла или каталога – fyr0049

+0

Установите 'shell = True', в этом случае. Это попросит Python выполнить команду через вашу оболочку (это в основном то же самое, что и 'os.system()'.) Или явно выделить «sh» и параметры в списке. – creichen

+0

Да, теперь он работает нормально. Однако я заметил, что python просто работает. Означает ли это, что я не могу двигаться дальше, пока это выполняется? – fyr0049

1

Дайте subprocess.Popen() попробовать, с УХОМ парами:

subprocess.Popen(['sh', './setup.sh'], cwd='/dir/contains/setup.sh/') 
Смежные вопросы