Python không thể tìm thấy mô-đun trong cùng một thư mục


97

Python của tôi bằng cách nào đó không thể tìm thấy bất kỳ mô-đun nào trong cùng một thư mục. Tôi đang làm gì sai? (python2.7)

Vì vậy, tôi có một thư mục '2014_07_13_test', với hai tệp trong đó:

  1. test.py
  2. hello.py

nơi hello.py:

# !/usr/local/bin/python
# -*- coding: utf-8 -*-

def hello1():
    print 'HelloWorld!'

và test.py:

# !/usr/local/bin/python
# -*- coding: utf-8 -*-

from hello import hello1

hello1()

Vẫn còn trăn cho tôi

>>> Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 4, in <module>
ImportError: No module named hello

Chuyện gì vậy?


2
Bạn đang thực thi script như thế nào? Ngoài ra sản lượng là những gìimport sys; sys.path
Salem

1
Hãy thử>>> import test
Martineau

@Casy_fill Bạn có chạy chương trình của mình từ thư mục không, các tệp hiện diện ở đâu? Đối với việc nhập, không quan trọng, các tệp nhập và tệp đã nhập có chung một thư mục. Điều quan trọng là trình thông dịch Python của bạn có thư mục hiện tại được đặt đúng cách.
Jan Vlcinsky

Câu trả lời:


79

Mã của bạn ổn, tôi nghi ngờ vấn đề của bạn là cách bạn khởi chạy nó.

Bạn cần khởi chạy python từ thư mục '2014_07_13_test' của mình.

Mở dấu nhắc lệnh và 'cd' vào thư mục '2014_07_13_test' của bạn.

Ví dụ:

$ cd /path/to/2014_07_13_test
$ python test.py

Nếu bạn không thể 'cd' vào thư mục như thế này, bạn có thể thêm nó vào sys.path

Trong test.py:

import sys, os
sys.path.append('/path/to/2014_07_13_test')

Hoặc đặt / chỉnh sửa PYTHONPATH

Và tất cả sẽ tốt ...

... cũng có một lỗi nhỏ với các dòng 'shebang' của bạn (dòng đầu tiên trong cả hai tệp của bạn), không được có khoảng trắng giữa '#' và '!'

Có một shebang tốt hơn bạn nên sử dụng.

Ngoài ra, bạn không cần dòng shebang trên mọi tệp ... chỉ những dòng bạn định chạy từ trình bao của mình dưới dạng tệp thực thi.


cảm ơn rất nhiều, rằng vấn đề! Thật không may, SublimeRepl (mà tôi sử dụng) không hỗ trợ bắt đầu trăn từ thư mục ngay bây giờ, vì vậy Dường như tôi cần phải export PATH tại
Philipp_Kats

Các độc giả sau này vui lòng đọc đến cuối trang để xem các câu trả lời rất hữu ích khác, ví dụ như câu trả lời từ jfn về nhập khẩu tương đối .
HongboZhu ngày

Đúng, đây là vấn đề của tôi. Tôi đã có một thư mục lớn gồm các dự án thực hành Python được mở trong VS Code và tôi đang gặp vấn đề lớn với việc tìm kiếm những thứ trong cùng một thư mục. Vấn đề của tôi là, trong thiết bị đầu cuối, tôi đã không thay đổi các thư mục thành thư mục con mà tôi có dự án hiện tại của mình. Khi tôi làm điều đó, vấn đề đã được giải quyết.
Matt West

105

Thay đổi nhập của bạn trong test.py thành:

from .hello import hello1

23
Nếu bất cứ ai khác tìm thấy sau này, điều này được gọi là hàng nhập khẩu tương đối và đã được bổ sung trong python 2.5: docs.python.org/2.5/whatsnew/pep-328.html
sgfit

9
Để nhập toàn bộ mô-đun sử dụngfrom . import hello
ST7

Tôi nghĩ rằng đây là một giải pháp tốt hơn câu trả lời được chấp nhận tốt nhất. Tôi sử dụng nhập toàn bộ mô-đun, như ST7 đã chỉ ra:from . import local_module
Gene M

25

Tôi đã gặp sự cố tương tự, tôi đã giải quyết nó bằng cách thêm rõ ràng thư mục của tệp vào danh sách đường dẫn:

import os
import sys

file_dir = os.path.dirname(__file__)
sys.path.append(file_dir)

Sau đó, tôi không gặp vấn đề gì khi nhập từ cùng một thư mục.


2
Trong khi điều này hiệu quả, câu trả lời từ jwn sử dụng hàng nhập khẩu tương đối là một giải pháp sạch hơn nhiều.
Russ Schultz

16

Đây là giải pháp chung mà tôi sử dụng. Nó giải quyết vấn đề khi nhập từ các mô-đun trong cùng một thư mục:

import os.path
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))

Đặt cái này ở đầu mô-đun sẽ xuất hiện lỗi "Không có mô-đun nào có tên xxxx"


1
Điều này đã giúp tôi tải mô-đun từ thư mục mẹ, bằng cách thay thế ".." bằng "../ ..". Cảm ơn rất nhiều!
Nikola R.

1
là tên tệp của tệp sẽ được nhập hoặc mô-đun hiện tại mà chúng tôi đang nhập mô-đun hoặc nó là không đổi
Manoj

9

Trong trường hợp của tôi, Python đã không thể tìm thấy nó vì tôi muốn đặt mã bên trong một mô-đun với dấu gạch nối, ví dụ my-module. Khi tôi thay đổi nó thành my_modulenó đã hoạt động.


1

Tôi đã gặp phải vấn đề này. Tôi có ba thư mục trong cùng một thư mục nên tôi phải chỉ định thư mục nào. Ví dụ: từ tập lệnh nhập thư mục


0

Phần sau không giải quyết được vấn đề của OP, nhưng tiêu đề và lỗi chính xác là những gì tôi phải đối mặt.

Nếu dự án của bạn có setup.pytập lệnh trong đó, bạn có thể cài đặt gói mà bạn đang sử dụng, với python3 -m pip install -e .hoặc python3 setup.py installhoặc python3 setup.py developvà gói này sẽ được cài đặt, nhưng vẫn có thể chỉnh sửa được (vì vậy các thay đổi đối với mã sẽ được nhìn thấy khi nhập gói). Nếu nó không có setup.py, hãy hiểu nó .

Dù sao, vấn đề OP gặp phải dường như không còn tồn tại nữa?

tập tin one.py:

def function():
    print("output")

tập tin two.py:

#!/usr/bin/env python3

import one
one.function()
chmod +x two.py # To allow execution of the python file
./two.py # Only works if you have a python shebang

Command line output: output

Các giải pháp khác có vẻ 'bẩn'

Trong trường hợp OP với 2 tệp thử nghiệm, sửa đổi chúng để hoạt động có lẽ là ổn. Tuy nhiên, trong các tình huống thực tế khác, các phương pháp được liệt kê trong các câu trả lời khác có thể không được khuyến khích. Chúng yêu cầu bạn sửa đổi mã python hoặc hạn chế tính linh hoạt của bạn (chạy tệp python từ một thư mục cụ thể) và thường gây ra những phiền toái. Điều gì sẽ xảy ra nếu bạn vừa nhân bản một dự án, và điều này xảy ra? Nó có thể đã hoạt động với những người khác và việc thay đổi mã là không cần thiết. Câu trả lời được chọn cũng muốn mọi người chạy một tập lệnh từ một thư mục cụ thể để làm cho nó hoạt động. Đây có thể là một nguồn gây khó chịu lâu dài, điều này không bao giờ tốt. Nó cũng gợi ý thêm thư mục python cụ thể của bạn vào PATH (có thể được thực hiện thông qua python hoặc dòng lệnh). Một lần nữa, điều gì sẽ xảy ra nếu bạn đổi tên hoặc di chuyển thư mục sau vài tháng? Bạn phải tìm lại trang này, và cuối cùng phát hiện ra bạn cần đặt đường dẫn (và bạn đã làm chính xác điều này vài tháng trước) và bạn chỉ cần cập nhật đường dẫn (chắc chắn rằng bạn có thể sử dụng sys.path và đặt nó theo chương trình, nhưng điều này vẫn có thể xảy ra ). Nhiều nguồn bức xúc lớn.

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.