Không thể nhập các mô-đun của riêng tôi trong Python


141

Tôi đang gặp khó khăn trong việc hiểu cách thức nhập mô-đun hoạt động trong Python (Tôi chưa bao giờ thực hiện nó bằng bất kỳ ngôn ngữ nào khác trước đó).

Hãy nói rằng tôi có:

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

Bây giờ tôi đang cố gắng để có được một cái gì đó như thế này:

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

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

Tuy nhiên, tôi chắc chắn đã làm điều gì đó sai vì Python không thể thấy đó myapplà một mô-đun:

ImportError: No module named myapp

Câu trả lời:


95

Trong trường hợp cụ thể của bạn, có vẻ như bạn đang cố gắng nhập SomeObjecttừ tập lệnh myapp.py và TestCase.py. Từ myapp.py, làm

import SomeObject

vì nó nằm trong cùng một thư mục. Đối với TestCase.py, hãy làm

from ..myapp import SomeObject

Tuy nhiên , điều này sẽ chỉ hoạt động nếu bạn đang nhập TestCase từ gói. Nếu bạn muốn trực tiếp chạy python TestCase.py, bạn sẽ phải lộn xộn với con đường của mình. Điều này có thể được thực hiện trong Python:

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

mặc dù điều đó thường không được khuyến khích

Nói chung, nếu bạn muốn người khác sử dụng gói Python của mình, bạn nên sử dụng distutils để tạo tập lệnh thiết lập. Bằng cách đó, bất cứ ai cũng có thể cài đặt gói của bạn một cách dễ dàng bằng cách sử dụng một lệnh như thế python setup.py installvà nó sẽ có sẵn ở mọi nơi trên máy của họ. Nếu bạn nghiêm túc về gói, bạn thậm chí có thể thêm nó vào Chỉ mục gói Python, PyPI .


Tôi đã thử đơn giản sử dụng importtrong tôi TestCase.pynhưng nó vẫn cho tôi lỗi tương tự. Tôi cho rằng đó là vì nó nằm trong một thư mục con của __init__.py?
n0pe

Oh chờ tôi nghĩ rằng tôi nhận được nó. Nếu các trường hợp thử nghiệm của tôi đang gọi từ gói, tôi sẽ có thể sử dụng from ... import ...đúng không?
n0pe

1
Bạn sẽ chỉ khi TestCase được nhập từ bên ngoài gói - ví dụ: nếu tôi chạy from myapp.tests import TestCase from a script outside myapp. If you're running python TestCase.py` trong thư mục kiểm tra, bạn không thể nhập tương đối
David Robinson

1
Tôi đã chạy "pip install -e." Để cài đặt myapp, nhưng khi thử chạy TestCase trong mã studio trực quan, tôi vẫn nhận được "ImportError: Không có mô-đun nào có tên myapp". nhưng nếu tôi chạy "python" và sau đó trong python chạy "từ myapp import someObject" thì nó hoạt động. Tôi đang làm gì sai?
dagrun

@DavidRobinson Tôi đã sử dụng phương pháp mà bạn đã đề cập, điều đó cho thấy không có lỗi sau khi thực hiện from fodername import file_name_of_my_py_code, nhưng khi tôi cố gắng truy cập vào đối tượng được xác định trong file_name_of_my_py_code.pynó nóiNameError: name 'ClassName' is not defined
Kavin Raju S

44

Hàm importtìm kiếm các tệp vào env PYTHONPATH của bạn. biến và thư mục địa phương của bạn. Vì vậy, bạn có thể đặt tất cả các tệp của mình vào cùng một thư mục hoặc xuất đường dẫn gõ vào terminal ::

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

2
Sau đó, làm thế nào tôi có thể chắc chắn rằng nó hoạt động cho những người khác sẽ sử dụng nó? Tôi không cần phải bảo họ đặt các biến môi trường nhất định trước khi chạy nó.
n0pe

1
thư mục hiện tại nằm trong pythonpath, vì vậy miễn là các tập lệnh nằm trong cùng thư mục / thư mục thì nó sẽ hoạt động. Thật không may, mỗi tập lệnh này nằm trong các thư mục riêng biệt.
JKirchartz

4
Đối với người dùng Windows, thay vì exportchúng tôi đã "đặt PYTHONPATH =% PYTHONPATH%; C: \ path_to_myapp \ myapp \ myapp \"
lov.by.Jesus

Trong mã vs tôi đã có thể sửa lỗi này bằng cách thêm biến Env PYTHONPATH vào launch.json của tôi: "env": {"PYTHONPATH": "$ {workspaceFolder}"}
Michael Armitage

11

con đường xuất khẩu là một cách tốt. Một cách khác là thêm .pth vào vị trí gói trang web của bạn. Trên máy mac, python của tôi giữ các gói trang web trong / Library / Python hiển thị bên dưới

/Library/Python/2.7/site-packages

Tôi đã tạo một tệp có tên awesome.pth tại / L Library / Python / 2.7 / site-packages / awclaw.pth và trong tệp đặt đường dẫn sau tham chiếu các mô-đun tuyệt vời của tôi

/opt/awesome/custom_python_modules

1
trong trường hợp tôi đang làm việc trong windows thì làm thế nào để làm điều đó
Nwawel A Iroume

Tôi không chắc. Trong trường hợp bạn đang sử dụng windows. Tìm một số phần mềm vm và sử dụng linux. Hoặc - xem câu trả lời này về việc xuất các biến trong windows. stackoverflow.com/questions/559816/ từ
jmontross

đây chính xác là những gì tôi cần
Lee88

1
Rất vui khi biết rằng @ Lee88 - tôi đã mất một lúc để tự mình hiểu ra :)
jmontross

9

Bạn co thể thử

from myapp.myapp import SomeObject

bởi vì tên dự án của bạn giống với tên myapp.py làm cho nó tìm kiếm tài liệu dự án trước


3

Trong thư mục myapp đầu tiên của bạn, bạn có thể thêm tệp setup.py và thêm hai mã python trong setup.py

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

trong thư mục myapp đầu tiên của bạn trong dòng lệnh, sử dụng pip install -e. để cài đặt gói


2

pip installtrên Windows 10 mặc định để cài đặt trong 'Tệp chương trình / PythonXX / Lib / gói trang web' là thư mục yêu cầu quyền quản trị. Vì vậy, tôi đã khắc phục sự cố của mình bằng cách chạy pip install as Administrator (bạn phải mở dấu nhắc lệnh với tư cách quản trị viên ngay cả khi bạn đã đăng nhập bằng tài khoản quản trị viên). Ngoài ra, an toàn hơn để gọi pip từ python.
ví dụ
python -m pip install <package-name>
thay vì
pip install <package-name>


0

Trong trường hợp của tôi, đó là sự bất ngờ giữa Windows và Python, mặc dù tên tệp của Windows không phân biệt chữ hoa chữ thường, nhập Python là. Vì vậy, nếu bạn có Stuff.pytập tin, bạn cần nhập tên này theo nguyên trạng.


0

Bạn cần phải có

__init__.py

trong tất cả các thư mục có mã bạn cần tương tác. Bạn cũng cần chỉ định tên thư mục trên cùng của dự án trong mỗi lần nhập ngay cả khi tệp bạn đã cố nhập cùng cấp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.