Даже если у вас есть другие планы распространения, возможно, стоит составить базовый setup.py
в ваша папка src
. Таким образом, вы можете запустить setup.py develop
, чтобы distutils поместил ссылку на ваш код в путь по умолчанию (это означает, что любые внесенные вами изменения будут отражены на месте без необходимости «переустанавливать», и все модули будут «просто работайте», независимо от того, где находятся ваши скрипты). Это будет одноразовый шаг, но это все же еще один шаг, чем ноль, поэтому все зависит от того, будет ли это более проблематичным, чем обновление .bashrc
. Если вы используете pip, эквивалентом будет pip install -e /path/to/src
.
Более надежное решение, особенно если вы собираетесь зеркалировать/версионировать эти скрипты на машинах нескольких разработчиков, — это выполнять работу по разработке в контролируемой виртуальной среде. Оказывается, в virtualenv даже есть встроенная поддержка создание собственных настроек начальной загрузки. Похоже, вам просто нужен хук after_install()
, чтобы настроить sitecustomize
, запустить pip install -e
или добавить простой файл .pth
в пакеты сайтов. Пользовательский загрузчик может находиться в системе управления версиями вместе с другими скриптами, и его нужно будет запускать один раз для каждой настройки разработчика. У вас также будут обычные преимущества использования virtualenv (явное управление версиями зависимостей, изоляция от общесистемной конфигурации и стандартизация между разрозненными машинами, и это лишь некоторые из них).
Если вы действительно не хотите выполнять какие-либо шаги по настройке и готовы только запускать эти сценарии из каталога 'project', тогда вы можете __init__.py
как таковой:
project/
src/
some_module.py
scripts/
__init__.py # special "magic"
some_script.py
И вот как могут выглядеть ваши файлы:
# file: project/src/some_module.py
print("importing %r" % __name__)
def some_function():
print("called some_function() inside %s" % __name__)
--------------------------------------------------------
# file: project/scripts/some_script.py
import some_module
if __name__ == '__main__':
some_module.some_function()
--------------------------------------------------------
# file: project/scripts/__init__.py
import sys
from os.path import dirname, abspath, join
print("doing magic!")
sys.path.insert(0, join(dirname(dirname(abspath(__file__))), 'src'))
Тогда вам нужно будет запускать свои скрипты так:
[~/project] $ python -m scripts.some_script
doing magic!
importing 'some_module'
called some_function() inside some_module
Остерегаться! Скрипты могут только вызываться изнутри project/
следующим образом:
[~/otherdir] $ python -m scripts.some_script
ImportError: no module named scripts
Чтобы включить это, вы вернетесь к редактированию .bashrc
или воспользуетесь одним из вариантов выше. Последний вариант действительно должен быть последним средством; как сказал @Simon, в этот момент вы действительно боретесь с языком.
person
Greg Haskins
schedule
31.08.2011
__init__.py
, но похоже, что вы боретесь с языком (что плохо :-)) - person Simon Bergot   schedule 31.08.2011