что-то не так с моим питоном - PullRequest
0 голосов
/ 24 февраля 2011

Я знаю, что это глупый вопрос, но я в тупике. Моя структура каталогов раньше выглядела так:

-src
  |
  -module.py
  -program.py

когда это какая у меня структура каталогов, я ссылался на модуль из программы и все было хорошо.

С тех пор я изменил свою структуру каталогов на:

-src
  |
  -__init.py
  -module.py
  |
  -programDir
    |
    -__init.py
    -program.py

теперь, конечно, я не могу добраться до модуля из программы. Как я могу ссылаться на SRC как пакет. Я пытался создать

__init__.py 

файл в каталоге src, но не повезло.

Моар Deets: операторы импорта, которые я пробовал в program.py:

import module

и

from src import module

первый работал, когда другой модуль и программа находились в одном каталоге.

ошибка, которую я получаю:

ImportError: No module named module

и просто для записи: Нет, мой модуль и программа не называются модулем ИЛИ программой

обновление: я пробовал это в моем файле program.py:

from ...src import module

и

from ..src import module

оба дают мне:

ValueError: Attempted relative import in non-package

Ответы [ 6 ]

2 голосов
/ 25 февраля 2011

Для начала, я рекомендую прочитать в документах запись Изменение пути поиска Python .

Некоторые могут его не одобрить, но если вы захотите изменить PYTHONPATH в вашей программе, в соответствии с стандартными модулями документации , вы можете использовать метод sys.path.append:

import sys
sys.path.append('..')
import module
1 голос
/ 25 февраля 2011

Не могли бы вы использовать PEP 328 для решения этой проблемы?

0 голосов
/ 25 февраля 2011

Если вы используете программу как часть пакета, в другом модуле Python, например,

import src.programDir.program as p

p.some_method()

вы можете использовать относительный импорт в program.py, если вы создаете пакет с помощью src (__init__.py в src и programDir)

from .. import module

Если нет, например, вы вызываете program.py из командной строки, вы должны добавить каталог, содержащий src, в ваш путь поиска, либо изменив sys.path или PYTHONPATH env var, перед импортом.

0 голосов
/ 25 февраля 2011

Вам нужно добавить __init__.py к /programDir, чтобы интерпретировать каталог как пакет. После того, как пакет, вы можете импортировать содержимое пакета.

Так, в вашем случае, если /src находится на PYTHONPATH, из module.py вы можете импортировать program.py с from programDir import program.

0 голосов
/ 25 февраля 2011

Первый сработал, поскольку первая запись Python sys.path - это '', что означает, что он будет искать имена модулей в текущем рабочем каталоге, из которого вы выполнили интерпретатор Python.

Проблемавы, кажется, считаете, что каталог, расположенный в src, не установлен на вашей PYTHONPATH.Таким образом, вы можете явно установить переменную окружения PYTHONPATH.

Вот пример использования bash:

export PYTHONPATH=PATH_TO_SRC:${PYTHONPATH}

, затем запустить вашу программу как обычновы можете явно установить sys.path, добавив к нему при выполнении вашей программы.

Итак, в вашем program.py вы должны иметь:

if __name__ == '__main__':
    import os
    import sys
    sys.path.append(os.path.dirname(os.path.dirname(__file__)))
    your_main_function()

Наконец, для серьезной разработки на Python, вы должны рассмотреть virtualenv и virtualenvwrapper , поскольку он позаботится о большинстве этих вещей для вас.

0 голосов
/ 25 февраля 2011

Если вы запускаете program.py напрямую, с python program.py или с #!, тогда каталог module.py должен находиться в PYTHONPATH, чтобы import module работал.Это может быть достигнуто с помощью вспомогательного сценария оболочки, который, например, хранится в programDir и выглядит примерно так:

#!/bin/bash

script_dir=`dirname $0`
# Add the script's parent directory to the PYTHONPATH
export PYTHONPATH=$PYTHONPATH:$script_dir/..

python $script_dir/program.py

Другим, возможно, лучшим способом было бы program.py export a "main() ", и создайте вспомогательный скрипт Python на src/program, который выглядит следующим образом:

#!/usr/bin/env python
from programDir.program import main
main()

В этом случае вы можете использовать относительный импорт в src/programDir/program.py, так чтодолжно работать:

from .. import module
...