Неможливо імпортувати власні модулі в Python


141

Мені важко зрозуміти, як працює імпорт модулів у Python (я жодного разу не робив його жодною іншою мовою).

Скажімо, у мене є:

myapp/__init__.py
myapp/myapp/myapp.py
myapp/myapp/SomeObject.py
myapp/tests/TestCase.py

Зараз я намагаюся отримати щось подібне:

myapp.py
===================
from myapp import SomeObject
# stuff ...

TestCase.py
===================
from myapp import SomeObject
# some tests on SomeObject

Однак я безумовно роблю щось не так, оскільки Python не бачить, що myappце модуль:

ImportError: No module named myapp

Відповіді:


96

У вашому конкретному випадку схоже, що ви намагаєтеся імпортувати SomeObjectзі скриптів myapp.py та TestCase.py. З myapp.py, зробіть

import SomeObject

оскільки він знаходиться в одній папці. Для TestCase.py, зробіть

from ..myapp import SomeObject

Однак це буде працювати лише в тому випадку, якщо ви імпортуєте TestCase з пакету. Якщо ви хочете безпосередньо бігти python TestCase.py, вам доведеться возитися зі своїм шляхом. Це можна зробити в межах Python:

import sys
sys.path.append("..")
from myapp import SomeObject

хоча це, як правило, не рекомендується.

Загалом, якщо ви хочете, щоб інші користувалися вашим пакетом Python, вам слід скористатися distutils для створення сценарію налаштування. Таким чином, кожен може легко встановити ваш пакет, використовуючи таку команду, як python setup.py installвін буде доступний скрізь на своїй машині. Якщо ви серйозно ставитесь до пакету, можете навіть додати його до індексу пакетів Python, PyPI .


Я спробував просто використовувати importв моєму, TestCase.pyале він все ще дав мені ту ж помилку. Я припускаю, що це тому, що це в підкаталозі __init__.py?
n0pe

О зачекайте, я думаю, що я це зрозумію. Якщо мої тестові випадки телефонують із пакета, я зможу скористатися from ... import ...правом?
n0pe

1
Ви будете лише в тому випадку, якщо TestCase імпортується з-за пакета - наприклад, якщо я запускаю from myapp.tests import TestCase from a script outside myapp. If you're running python TestCase.py` в папці тестів, ви не можете виконати відносний імпорт
Девід Робінсон,

1
Я запустив "pip install -e.", Щоб встановити myapp, але при спробі запустити TestCase у коді візуальної студії я все одно отримую "ImportError: Немає модуля з іменем myapp". але якщо я запускаю "python", а потім у python run "з myapp import SomeObject", він працює. Що я роблю неправильно?
dagrun

@DavidRobinson Я використав описаний вами метод, який не виявив помилок після виконання from fodername import file_name_of_my_py_code, але коли я намагався отримати доступ до визначеного в file_name_of_my_py_code.pyньому об’єкта, говоритьNameError: name 'ClassName' is not defined
Kavin Raju S

44

Функція importшукає файли у вашій PYTHONPATH env. змінна та ваш локальний каталог. Таким чином, ви можете або помістити всі свої файли в один і той же каталог, або експортувати шлях введення в термінал ::

export PYTHONPATH="$PYTHONPATH:/path_to_myapp/myapp/myapp/"

2
Тоді як я можу переконатися, що він працює для всіх інших, хто користувався б ним? Я б краще не сказав їм встановлювати певні змінні середовища перед його запуском.
n0pe

1
поточний каталог знаходиться в pythonpath, тому поки скрипти знаходяться в одній папці / каталозі, він повинен працювати. на жаль, кожен із цих сценаріїв знаходиться в окремих каталогах.
JKirchartz

4
Для користувачів Windows замість цього exportми "встановили PYTHONPATH =% PYTHONPATH%; C: \ path_to_myapp \ myapp \ myapp \"
loved.by.Jesus

У коді vs я зміг це виправити, додавши змінну PYTHONPATH Env до мого start.json: "env": {"PYTHONPATH": "$ {workspaceFolder}"}
Майкл Армітаж

11

експортний шлях - хороший шлях. Інший спосіб - додати .pth до місця вашого веб-пакету. На моєму комп'ютері мій python зберігає пакети сайтів у / Library / Python, показаних нижче

/Library/Python/2.7/site-packages

Я створив файл під назвою awesome.pth в /Library/Python/2.7/site-packages/awesome.pth і у файл поклав наступний шлях, який посилається на мої дивовижні модулі

/opt/awesome/custom_python_modules

1
у випадку, коли я працюю у Windows, як це зробити
Nwawel A Iroume

Я не впевнений. У випадку, якщо ви використовуєте windows. Знайдіть програмне забезпечення vm та використовуйте Linux. Або - див. Цю відповідь щодо експорту змінних у Windows. stackoverflow.com/questions/559816 / ...
jmontross

це саме те, що мені потрібно
Lee88

1
Радий почути це @ Lee88 - знадобився час, щоб я сам це
зрозумів

9

Ви можете спробувати

from myapp.myapp import SomeObject

оскільки назва вашого проекту збігається з myapp.py, завдяки якому спочатку шукається проект проекту


3

У вашому першому каталозі myapp ви можете додати файл setup.py та додати два коду python у setup.py

from setuptools import setup
setup(name='myapp')

у своєму першому каталозі myapp в командному рядку використовуйте pip install -e. встановити пакет


2

pip installу Windows 10 за замовчуванням встановлюється у "Program Files / PythonXX / Lib / site-пакети", що є каталогом, який вимагає адміністративних прав. Тому я вирішив свою проблему, запустивши pip install як адміністратор (вам потрібно відкрити командний рядок як адміністратор, навіть якщо ви ввійшли в систему з обліковим записом адміністратора). Також безпечніше дзвонити pip з python.
наприклад
python -m pip install <package-name>
замість
pip install <package-name>


0

У моєму випадку це було несподіванкою Windows проти Python, незважаючи на те, що файли Windows не залежать від регістру, імпорт Python є. Тож якщо у вас є Stuff.pyфайл, вам потрібно імпортувати це ім’я як є.


0

Вам потрібно мати

__init__.py

у всіх папках, у яких є код, з яким потрібно взаємодіяти. Вам також потрібно вказати назву верхньої папки вашого проекту при кожному імпорті, навіть якщо файл, який ви намагалися імпортувати, знаходиться на одному рівні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.