Как импортировать код Python из файла? - PullRequest
1 голос
/ 23 декабря 2011

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

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

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

Ответы [ 3 ]

3 голосов
/ 23 декабря 2011

Хотя вы можете добавить путь к Python для конкретного файла, используя:

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

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

from line import Line
class LineSegment(line):

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

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

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

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

Если ваш линейный модуль импортирует и создает экземпляр объекта из файла, используя путь somemodule.afile.SomeObject

Это нетот же класс, что и для создания экземпляра объекта из afile:

afile.SomeObject.

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

somemodule.afile.SomeObject == afile.SomeObject
==> False
1 голос
/ 23 декабря 2011

Самый простой способ использовать код Python в других файлах - это использовать оператор import .

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

import xyz 

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

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

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

from line import line

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

class newline(line):

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

python line_segment.py

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

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

~$ python /path_to/path_finding_lib line_segment.py

Это НЕ будет работать. Это потому, что python будет искать пакеты сайтов, PYTHONPATH и ваш текущий каталог, а не находить line.py. Чтобы иметь возможность запускать его из любого места, перед его запуском добавьте местоположение line.py в PYTHONPATH

$export PYTHONPATH=/path_to/path_finding_lib

Тогда вы сможете запустить его

ПРИМЕЧАНИЕ: я предполагаю, что у вас есть Linux-система. Для Windows к сожалению я не знаю процедуру модификации PYTHONPATH

0 голосов
/ 23 декабря 2011

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

...