2014-02-10 4 views
2

Я реализует следующий метод в Python:Как перезагрузить модуль python?

def install_s3cmd(): 
    subprocess.call(['sudo easy_install s3cmd']) 

    # assuming that by now it's already been installed 
    import pexpect 

    # now use pexpect to configure s3cdm 
    child = pexpect.spawn('s3cmd --configure') 
    child.expect ('(?i)Access Key') 
    # ... more code down there 

def main(): 
    subprocess.call(['sudo apt-get install python-setuptools']) # installs easy_install 
    subprocess.call(['sudo easy_install pexpect']) # installs pexpect 
    install_s3cmd() 
    # ... more code down here 

if __name__ == "__main__": 
    main() 

мне нужно иметь pexpect установлен, так что я могу установить s3cmd --configure. pexpect установлен правильно, и в первый раз скрипт выполняется, я получаю сообщение об ошибке, которое может найти pexpect. Однако во второй раз, когда я запускаю скрипт, он работает безупречно. Вероятно, потому, что библиотеки python не обновлялись. Как я могу обновить или обновить модуль python, чтобы у меня снова не было этой проблемы?

+0

кстати: вместо того, чтобы обманывать sudo (!), Вы можете просто написать 'setup.py' для этого скрипта и позволить инструменту, подобному pip, устанавливать зависимости для вас. – Eevee

+0

@Eevee Я сделаю это в конце концов – cybertextron

ответ

2

Когда Python запускается, он определяет, какие каталоги для поиска модулей, и добавляет их все в sys.path. Проблема, которую вы видите, вероятно, связана с тем, что apt устанавливает совершенно новый каталог, о котором Python тогда не знает.

Я не могу сказать, насколько надежно это, но есть функции в site module, которые утверждают, что сделать то же сканирование каталога как Python делает при запуске, так что вы можете попробовать это:

import site 
import sys 
sys.path[:] = site.getusersitepackages() + site.getsitepackages() 

предостережений: это будет не оставить текущую директорию в вашем пути, это может смутить существующие модули, если каталоги сильно изменились с момента запуска программы и т. д.

Немного более надежный подход состоял бы в проверке списков, возвращаемых эти функции и добавить любые новых каталогов до конца sys.path, вместо того, чтобы заменить его прямо.

+0

'локальная переменная 'pexpect', на которую ссылаются перед присваиванием' ... вот что произошло – cybertextron

+0

Я не работал ... – cybertextron

+0

Возможно, вам нужно разместить свой код; это не должно произойти, учитывая то, что в вашем вопросе. – Eevee

Смежные вопросы