2012-02-21 18 views
69

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

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 gì đó sai như Python không có thể thấy rằng myapp là một mô-đun:

ImportError: No module named myapp 

Trả lời

53

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

import SomeObject 

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

from ..myapp import SomeObject 

Tuy nhiên, điều này sẽ chỉ làm việc nếu bạn đang nhập TestCase từ gói. Nếu bạn muốn chạy trực tiếp python TestCase.py, bạn sẽ phải gây rối với con đường của bạn. Đ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ù thường không được khuyến nghị.

Nói chung, nếu bạn muốn người khác sử dụng gói Python, bạn nên sử dụng distutils để tạo tập lệnh thiết lập. Bằng cách đó, bất kỳ 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 lệnh như python setup.py install và 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.

+0

Tôi đã thử sử dụng' import' trong 'TestCase.py' nhưng vẫn cho tôi cùng một lỗi. Tôi cho rằng đó là vì nó nằm trong thư mục con của '__init __. Py'? – n0pe

+0

Ồ, đợi đã, tôi nghĩ mình đã hiểu rồi. 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 ...' phải không? – n0pe

+1

Bạn sẽ chỉ khi TestCase đang được nhập từ bên ngoài gói- ví dụ: nếu tôi chạy 'từ myapp.tests nhập TestCase từ tập lệnh bên ngoài myapp. Nếu bạn đang chạy 'python TestCase.py' trong thư mục kiểm tra, bạn không thể thực hiện nhập khẩu tương đối –

20

Chức năng import tìm kiếm tệp es vào PYTHONPATH env của bạn. biến và thư mục cục bộ của bạn. Vì vậy, bạn có thể đặt tất cả các tập tin của bạn trong cùng thư mục, hoặc xuất khẩu đường gõ vào một thiết bị đầu cuối ::

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

Sau đó, làm cách nào để đảm bảo nó hoạt động cho tất cả những người khác sẽ sử dụng? Tôi không muốn nói với họ để thiết lập các biến môi trường nhất định trước khi chạy nó. – n0pe

+0

thư mục hiện tại nằm trong pythonpath, miễn là các tập lệnh nằm trong cùng thư mục/thư mục, nó sẽ hoạt động. rất tiếc, mỗi tập lệnh này nằm trong các thư mục riêng biệt. – JKirchartz

+2

Đối với người dùng Windows, thay vì 'export', chúng tôi đã" đặt PYTHONPATH =% PYTHONPATH%; C: \ path_to_myapp \ myapp \ myapp \ " –

8

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

/Library/Python/2.7/site-packages 

Tôi tạo ra một tập tin gọi awesome.pth tại /Library/Python/2.7/site-packages/awesome.pth và trong tập tin đặt đường dẫn sau đó tham chiếu module 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 cửa sổ làm cách nào để thực hiện điều đó –

+0

Tôi không chắc chắn. Trong trường hợp bạn đang sử dụng các cửa sổ. 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ề xuất các biến trong cửa sổ. http://stackoverflow.com/questions/559816/how-to-export-and-import-environment-variables-in-windows – jmontross

+0

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

2

bạn có thể thử

from myapp.myapp import SomeObject 

vì tên dự án của bạn là giống như myapp.py mà làm cho nó tìm kiếm các dự án d ocument đầu tiên

0

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 khi thiết lập.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

Các vấn đề liên quan