2011-12-23 4 views
1

Я не решался спросить об этом, потому что видел похожие вопросы с чрезмерно сложными ответами. Вопрос, на который я действительно хочу ответить, был закрыт из-за того, что он «расплывчатый» и «не настоящий вопрос», поэтому я буду как можно более конкретным.Как импортировать код python из файла?

У меня есть объект под названием «строка» в файле под названием «line.py». Я хочу создать другой объект, который наследуется от «строки», называемый «line_segment», и помещать его в файл с именем «line_segment.py» в том же каталоге.

path_finding_lib/ 
    line.py 
    line_segment.py 
    a_star.py 

Проблема в том, что я не могу найти способ использовать код в «line.py» изнутри «line_segment.py» без добавления строк в системной переменной PATH и тому подобное.

Не существует способа импорта из пути к файлу чего-то подобного? Если нет, почему бы и нет?

+0

Это все еще слишком неопределенно: что именно происходит, если вы просто используете 'import line' в' line_segment.py'? Как вы запускаете программу, т. Е. В каком файле выполняется «запуск»? –

ответ

3

В то время как вы могли бы добавить к пути питона для конкретного файла с помощью:

import sys 
sys.path.append('pathtoModule') 

Если они находятся в той же папке, (не модуль, так как вам не хватает в инициализации .py), вам можно просто импортировать из модуля линии, выполнив:

from line import Line 
class LineSegment(line): 

Соглашение об именах поставляют подчеркивания и нижний регистр для модулей, Капитализированный для классов: http://www.python.org/dev/peps/pep-0008/

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

Если у вас есть объект объявлен следующим образом:

path_finding_lib/ 
    line.py 
    line_segment.py 
    a_star.py 
    somemodule/ 
     afile.py 

, если ваш импорт модуля строки и инициализирует объект из AFile используя путь somemodule.afile.SomeObject

Это не тот же класс, как создание объекта из в AFile:

afile.SomeObject. 

Если AFile возвращает экземпляр afile.SomeObject и объект сравнивается на равенство с instanc e of somemodule.afile.SomeObject, они будут считаться не эквивалентными. т.е.

somemodule.afile.SomeObject == afile.SomeObject 
==> False 
+0

спасибо, это было очень полезно. Извините, что он также назвал имена переменных. Я все еще довольно новичок в python и не очень разбираюсь в соглашениях об именах (так спасибо за ссылку). – user1003620

0

Поскольку они находятся в том же каталоге, создайте пустой файл с именем __init__.py. Это позволяет Python рассматривать каталог, из которого вы работаете, как пакет, и вы сможете извлекать объекты и методы из этих других файлов.

1

Самый простой способ использовать код python в других файлах - использовать инструкцию import.

Скажите, когда вы делаете

import xyz 

Python попытается найти файл xyz.py.Он смотрит в

  1. Папка-сайт пакеты (который папку в директории установки питона, который содержит предварительно установленные модули, как говорят, Джанго и т.д.)
  2. Места, указанные в переменной окружения PYTHONPATH (или sys.path в питон)
  3. Ваш текущий каталог

В вашем случае, ваша программа должна иметь следующую строку

from line import line 

Где первая строка файл line.py и вторая строка ваш класс Везде, где вы хотите использовать линейный объект для наследования просто использовать

class newline(line): 

Загвоздка в том, как вы запустите программу. Если запустить его изнутри path_finding_lib (то есть, когда ваш рабочий каталог path_finding_lib и вы

python line_segment.py 

, он должен работать (Вы можете также необязательно сделать пустой файл инициализации .py в той же папке).

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

~$ python /path_to/path_finding_lib line_segment.py 

Это не будет работать. Это потому, что питон будет искать сайт-пакеты, PYTHONPATH и текущий каталог и не найти line.py. чтобы быть в состоянии запустить его отовсюду, прежде чем запустить его добавить расположение line.py к PYTHONPATH

$export PYTHONPATH=/path_to/path_finding_lib 

Тогда вы должны быть в состоянии запустить его

Примечание: я предположил, что у вас есть Линукс ystem. Для Windows, к сожалению, я не знаю процедуры изменения PYTHONPATH

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

  • Нет связанных вопросов^_^