Куда должен идти оператор sys.path.append ('...')? - PullRequest
3 голосов
/ 24 февраля 2010

Только после стандартного импорта pythonmodule? Если я откладываю это до основной функции и выполняю импорт моего конкретного модуля перед этим, это выдает ошибку (что совершенно очевидно). Руководство по стилю Python, где не упоминается правильное местоположение для него.

Ответы [ 5 ]

8 голосов
/ 24 февраля 2010

Он должен идти до операторов import или from, которые в этом нуждаются (что, как вы говорите, очевидно). Так, например, модуль может начинаться с:

import sys
import os
import math
try:
  import foo
except ImportError:
  if 'foopath' in sys.path: raise
  sys.path.append('foopath')
  import foo

Обратите внимание, что я добавил условное добавление (в случае сбоя импорта и путь к конкретному модулю еще не включен sys.path), чтобы избежать риска того, что sys.path может закончиться десятками случаев строки foopath, которая не будет особенно полезна; -).

3 голосов
/ 24 февраля 2010

Одна из причин, по которой это не упоминается в PEP 8 или других хороших руководствах по стилю Python, заключается в том, что изменение sys.path - это не то, что вы хотите сделать в реальной программе ; это делает вашу программу менее надежной и переносимой. Лучшим решением может быть размещение вашего пакета где-нибудь, который уже будет в sys.path или определение PYTHONPATH для всей системы, чтобы включить ваш пакет.

1 голос
/ 24 февраля 2010

Я часто использую сценарий оболочки для запуска своих приложений на Python: мой оператор sys.path.insert (append) помещается сразу после импорта "стандартного" модуля python в мой "сценарий запуска python".

При использовании sys.path.insert(0, ...) ваши «импорты» получают приоритет в списке путей.

0 голосов
/ 24 февраля 2010

Я думаю, что это вопрос вкуса. Но большинство людей склонны ставить это за import sys :-) Я предпочитаю оборачивать его в дополнительную функцию:

def importmod_abs(name):
   sys.path.append() ..

   __import__ ...

   sys.path.pop()

... таким образом sys.path остается чистым. Конечно, это применимо только к определенным структурам модулей. В любом случае, я бы импортировал все, что работает, без изменения sys.path.

0 голосов
/ 24 февраля 2010

Обычно я делаю это перед тем, как что-либо импортировать. Если вы беспокоитесь о том, что имена ваших модулей могут конфликтовать с именами stdlib Python, измените имена модулей!

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