2012-04-24 5 views
2

У меня есть простой пакет питона со следующей структурой:Модули Python, ссылающиеся на другие модули в одном пакете?

wibble 
| 
|-----foo 
|  |----ping.py 
| 
|-----bar 
|  |----pong.py 

Простой вопрос: Как бы я ссылаться на функцию/класс в ping.py от pong.py? Просматривая документацию, это выглядит так же просто, как создание файлов __init__.py в корне wibble, foo и bar, а затем от pong.py что-то вроде from wibble.foo.ping import important_function. Однако, попытка этого приводит к No module named wibble.foo.ping.

Я уверен, что кое-что пропустил в документации, потому что это должно быть возможно. Я также немного туман на дифференциации между module и namespace, мой фон - C# .net, поэтому любые аналоги здесь будут полезны.

ответ

2

вам нужно добавить Wibble к пути питона (см the official documentation), один путь

import sys 
sys.path.append('/path/to/wibble') 

Другой способ с переменной окружения PYTHONPATH

export PYTHONPATH=$PYTHONPATH:/path/to/wibble 
+1

В Windows, так что это будет 'PATH =% PATH%; c: \ path \ to \ wibble' (просто гадать из-за ссылки C# .net.) – alan

+0

Я должен был сказать - это разрабатывается на * nix. Моя озабоченность по поводу этого решения заключается в том, что он жестко привязывает абсолютное расположение пакета к кодовой базе/инфраструктуре. Учитывая, что эти файлы легко локализуются относительно друг друга, почему «понг» не знает, что он находится в пакете 'wibble', а затем находит« ping »таким образом? – growse

+0

Вы можете динамически угадать местоположение файла pong.py и добавить папку wibble в путь python, но, безусловно, это плохая практика – diegueus9

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