Nhập khẩuError: Không có mô-đun tên là Khi cố gắng chạy tập lệnh Python


144

Tôi đang cố chạy một kịch bản khởi chạy, trong số những thứ khác, một kịch bản python. Tôi nhận được một ImportError: Không có mô-đun nào có tên ... tuy nhiên, nếu tôi khởi chạy ipython và nhập cùng một mô-đun theo cùng một cách thông qua trình thông dịch, mô-đun được chấp nhận.

Điều gì đang xảy ra, và làm thế nào tôi có thể sửa chữa nó? Tôi đã cố gắng hiểu làm thế nào python sử dụng PYTHONPATH nhưng tôi hoàn toàn bối rối. Bất kỳ trợ giúp sẽ đánh giá rất cao.


4
Bạn cần cung cấp thêm thông tin. Khi bạn nói "chạy tập lệnh", bạn có nghĩa là tập lệnh shell? Mô-đun nào mà bạn không thể nhập? Module đó nằm ở đâu? Kịch bản của bạn nằm ở đâu?
BrenBarn

2
Nếu bạn muốn có câu trả lời dứt khoát cho "chuyện gì đang xảy ra", hãy bắt đầu python với -vtùy chọn và bạn sẽ thấy python ở đâu (hoặc không) tìm thấy các mô-đun bạn nhập.
FatalError

Bạn đang cố gắng nhập gì? Là hai kịch bản python trong cùng một thư mục?
pynovice

2
Vui lòng cung cấp cho chúng tôi mã bạn đang chạy, toàn bộ văn bản của dấu vết ngăn xếp và các bước chính xác bạn đang thực hiện để tạo ra lỗi. Thật khó để hỗ trợ khi chúng ta không biết vấn đề chính xác là gì.
MattDMo

5
Tôi đoán đó là một vấn đề rất nhiều người dùng trải nghiệm, thậm chí 4 năm sau khi câu hỏi được hỏi lần đầu tiên.
CodeOcelot

Câu trả lời:


182

Vấn đề này phát sinh do cách trình thông dịch IPython dòng lệnh sử dụng đường dẫn hiện tại của bạn so với cách một quy trình riêng biệt thực hiện (có thể là sổ ghi chép IPython, quy trình bên ngoài, v.v.). IPython sẽ tìm kiếm các mô-đun để nhập không chỉ được tìm thấy trong sys.path của bạn, mà còn trên thư mục làm việc hiện tại của bạn. Khi bắt đầu một trình thông dịch từ dòng lệnh, thư mục hiện tại bạn đang hoạt động giống với thư mục bạn đã khởi động ipython. Nếu bạn chạy

import os
os.getcwd() 

bạn sẽ thấy điều này là đúng

Tuy nhiên, giả sử bạn đang sử dụng sổ ghi chép ipython, hãy chạy os.getcwd()và thư mục làm việc hiện tại của bạn thay vào đó là thư mục mà bạn đã bảo sổ ghi chép hoạt động trong tệp ipython_notebook_config.py (thường sử dụng c.NotebookManager.notebook_dircài đặt).

Giải pháp là cung cấp trình thông dịch python với đường dẫn đến mô-đun của bạn. Giải pháp đơn giản nhất là nối đường dẫn đó vào danh sách sys.path của bạn. Trong sổ ghi chép của bạn, trước tiên hãy thử:

import sys
sys.path.append('my/path/to/module/folder')

import module-of-interest

Nếu điều đó không hiệu quả, bạn đã có một vấn đề khác trong tay không liên quan đến đường dẫn nhập khẩu và bạn nên cung cấp thêm thông tin về vấn đề của mình.

Cách tốt hơn (và lâu dài hơn) để giải quyết vấn đề này là đặt PYTHONPATH của bạn , cung cấp trình thông dịch với các thư mục bổ sung tìm kiếm các gói / mô-đun python. Chỉnh sửa hoặc đặt PYTHONPATH làm var toàn cầu phụ thuộc vào os và được thảo luận chi tiết ở đây cho Unix hoặc Windows .


1
PSA: nếu bạn đã đến câu hỏi SO này vì bạn đang gặp lỗi này trong sổ ghi chép jupyter, thì hãy xem bên dưới, stackoverflow.com/a/27944947/127971 Thật không may, câu hỏi không đủ cụ thể cho một câu trả lời.
michael

@michael câu trả lời đó là về việc nhập các mô-đun Python trong trường hợp chung; tập tin dunder init.py là cần thiết khi trình thông dịch tìm kiếm các thư mục cho các mô-đun để nhập, sổ ghi chép hay không. Câu trả lời trên về thư mục làm việc của trình thông dịch sổ ghi chép và cài đặt PYTHONPATH là chính xác.
BoltzmannBrain

Tôi đã nói rằng sẽ có nhiều câu trả lời đúng, do từ ngữ của câu hỏi. Tôi không ngụ ý câu trả lời này là không chính xác. Nhưng nếu sử dụng jupyter-notebook, bạn sẽ chạm vào tập tin __init_.py, phải không? ... Và, sẽ không muốn sửa đổi PYTHONPATHcũng không gọi sys.path.append, ngay cả khi chúng cũng đúng (đúng?). Ý tôi là, tôi có hàng tá thư mục w / code trong đó và tôi sẽ không thêm tất cả chúng vào đường dẫn - hoặc mong đợi người dùng khác vào tệp cấu hình jupyter của họ, ngay cả khi đó là một thư mục.
michael

16

Chỉ cần tạo một tệp python trống có tên __init__.pytrong thư mục hiển thị lỗi, trong khi bạn chạy dự án python.


1
Bởi ' init.py ' bạn có nghĩa là '_ init_ .py', phải không? Tôi đã tạo _ init_ .py dưới dạng một tệp trống và nó hoạt động với tôi. Cảm ơn rất nhiều. Nhưng tại sao điều này lại cần thiết? Trước khi tôi có một tập lệnh python trong cùng thư mục với sổ ghi chép ipython của tôi và quá trình nhập đã hoạt động tốt.
Eduardo Reis

3
trên thực tế init .py được sử dụng để chỉ python để chỉ ra có một số gói chứa trong vị trí tương ứng đó. sau đó chỉ có nó sẽ tìm thấy các mô-đun phụ bất cứ điều gì bạn tạo ra dưới nó. nếu bạn không tạo ' init .py' có nghĩa là python không biết có một số gói trong đó. Ví dụ: từ "Myfolder.Mypackage mymodules" cho ví dụ này, bạn nên khởi tạo init .py để chỉ ra python để cho biết có một số gói ở đây. khác nó không biết.
Mohideen bin Mohammed

1
Đúng, câu trả lời hoàn hảo. Điều đó cần thiết ở python 2.7, nhưng lưu ý trong 3
Agape Gal'lo

Điều này đã khắc phục sự cố trong python 3 cho tôi.
Rick hỗ trợ Monica

cũng đã khắc phục sự cố cho tôi - sử dụng sổ ghi chép jupyter, với nguồn python trong thư mục con của tệp ipynb; ví dụ: foo.ipynbsử dụng bar/baz.py, thêm bar/__init__.pytệp trống để sổ ghi chép có thể sử dụngfrom bar.baz import MyClass
michael

12

Hãy chắc chắn rằng cả hai đều sử dụng cùng một trình thông dịch. Điều này đã xảy ra với tôi trên Ubuntu:

$ ipython3 -c 'import sys; print(sys.version)'
3.4.2 (default, Jun 19 2015, 11:34:49) \n[GCC 4.9.1]

$ python3 -c 'import sys; print(sys.version)'
3.3.0 (default, Nov 27 2012, 12:11:06) \n[GCC 4.6.3]

sys.pathlà khác nhau giữa hai phiên dịch viên. Để sửa nó, tôi gỡ bỏ Python 3.3.


đã sử dụng miniconda để cài đặt một loạt các thứ liên quan đến trăn tôi cũng gặp vấn đề này. Con trăn ub Ubuntu 2.7 đi kèm khác với con trăn miniconda 2.7. Câu trả lời này cho phép tôi khắc phục sự cố
bph

4
Đây là vấn đề của tôi. Tôi đã nâng cấp lên python 2.7.11 nhưng vỏ tương tác iPython của tôi vẫn đang sử dụng 2.7.5. Tôi chỉ cần chạy pip install --upgrade ipythonđể có phiên bản mới nhất và sau đó nó tự động sử dụng 2.7.11.
Abundnce10

IPython của tôi là 7.4.0 trong khi không có phiên bản Python nào như vậy cả.
aderchox

@aderchox Chạy cái này trong ipython để có phiên bản trình thông dịch:import sys; sys.version
z0r

7

Lý do chính là sys.paths của Python và IPython là khác nhau.

Vui lòng tham khảo liên kết lucypark , giải pháp hoạt động trong trường hợp của tôi. Nó xảy ra khi cài đặt opencv bởi

conda install opencv

Và đã gặp lỗi nhập trong iPython, Có ba bước để giải quyết vấn đề này:

import cv2
ImportError: ...

1. Kiểm tra đường dẫn trong Python và iPython bằng lệnh sau

import sys
sys.path

Bạn sẽ tìm thấy kết quả khác nhau từ Python và Jupyter. Bước thứ hai, chỉ cần sử dụng sys.path.append để sửa đường dẫn bị bỏ lỡ bằng cách thử và lỗi.

2. Giải pháp tạm thời

Trong iPython:

import sys
sys.path.append('/home/osboxes/miniconda2/lib/python2.7/site-packages')
import cv2

các ImportError:..vấn đề được giải quyết

3. Giải pháp vĩnh viễn

Tạo một hồ sơ iPython và thiết lập bổ sung ban đầu:

Trong vỏ bash:

ipython profile create
... CHECK the path prompted , and edit the prompted config file like my case
vi /home/osboxes/.ipython/profile_default/ipython_kernel_config.py

Trong vi, nối vào tệp:

c.InteractiveShellApp.exec_lines = [
 'import sys; sys.path.append("/home/osboxes/miniconda2/lib/python2.7/site-packages")'
]

LÀM XONG


'hồ sơ ipython tạo' .... Vâng! Đây là giải pháp duy nhất (vĩnh viễn) giải quyết sổ ghi chép jupyter không đọc từ môi trường PATH và PYTHONPATH ... mà không dùng đến các câu lệnh sys.path lộn xộn ở đầu mỗi tệp (yuk). cảm ơn bạn
JohnL_10

6

Làm sys.path.append('my-path-to-module-folder')sẽ hoạt động, nhưng để tránh phải làm điều này trong IPython mỗi khi bạn muốn sử dụng mô-đun, bạn có thể thêm export PYTHONPATH="my-path-to-module-folder:$PYTHONPATH"vào ~/.bash_profiletệp của mình .


2

Trước khi cài đặt ipython, tôi đã cài đặt các mô-đun thông qua easy_install; Nóisudo easy_install mechanize .

Sau khi cài đặt ipython, tôi phải chạy lại easy_install để ipython nhận ra các mô-đun.


2

Có một vấn đề tương tự, đã khắc phục nó bằng cách gọi python3thay vì python, các mô-đun của tôi nằm trong Python3.5.


2

Nếu bạn đang chạy nó từ dòng lệnh, đôi khi trình thông dịch python không biết đường dẫn cần tìm mô-đun.

Dưới đây là cấu trúc thư mục của dự án của tôi:

/project/apps/..
/project/tests/..

Tôi đã chạy lệnh dưới đây:

>> cd project

>> python tests/my_test.py

Sau khi chạy lệnh trên, tôi gặp lỗi dưới đây

no module named lib

lib đã được nhập trong my_test.py

tôi đã in sys.path và tìm ra rằng đường dẫn của dự án tôi đang thực hiện không có sẵn trong danh sách sys.path

tôi đã thêm mã dưới đây khi bắt đầu kịch bản của tôi my_test.py.

import sys
import os

module_path = os.path.abspath(os.getcwd())    

if module_path not in sys.path:       

    sys.path.append(module_path)

Tôi không chắc liệu đó có phải là một cách tốt để giải quyết hay không nhưng vâng nó đã làm việc cho tôi.


Điều này sẽ hoạt động nếu bạn luôn chạy tập lệnh từ cùng một vị trí. Mặt khác, bạn sẽ gặp vấn đề kể từ khi os.getcwd()nhận được thư mục nơi tập lệnh được chạy, không phải thư mục chứa tệp tập lệnh.
Nathan Arthur

1

Đây là cách tôi sửa nó:

import os
import sys
module_path = os.path.abspath(os.getcwd() + '\\..')
if module_path not in sys.path:
    sys.path.append(module_path)


0

Tôi đã tìm thấy một nguồn khác của sự khác biệt này:

Tôi đã cài đặt ipython cả cục bộ và phổ biến trong virtualenvs. Vấn đề của tôi là, bên trong một virtualenv mới được tạo ra với ipython, hệ thống ipython đã được chọn, đó là một phiên bản khác với python và ipython trong virtualenv (2.7.x so với 3.5.x) và sự vui nhộn xảy ra sau đó.

Tôi nghĩ rằng điều thông minh cần làm bất cứ khi nào cài đặt thứ gì đó sẽ có nhị phân yourvirtualenv/binlà chạy ngay lập tức rehashhoặc tương tự cho bất kỳ shell nào bạn đang sử dụng để python / ipython chính xác được chọn. (Phải kiểm tra xem có pipmóc cài đặt sau phù hợp không ...)


0

Giải pháp mà không cần kịch bản:

  1. Mở Spyder -> Công cụ -> Trình quản lý PYTHONPATH
  2. Thêm đường dẫn Python bằng cách nhấp vào "Thêm đường dẫn". Ví dụ: 'C: \ Users \ User \ AppData \ Local \ Programs \ Python \ Python37 \ Lib \ site-gói'
  3. Nhấp vào "Đồng bộ hóa ..." để cho phép các chương trình khác (ví dụ: Jupyter Notebook) sử dụng các pythonpath được đặt ở bước 2.
  4. Khởi động lại Jupyter nếu nó đang mở

0

Điều này có thể do các phiên bản python khác nhau được cài đặt trên hệ thống của bạn , ví dụ python2 hoặc python3 .

Chạy lệnh $ pip --version$ pip3 --versionđể kiểm tra pip nào từ Python 3x . Ví dụ: bạn sẽ thấy thông tin phiên bản như dưới đây:

pip 19.0.3 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)

Sau đó chạy example.pytập lệnh với lệnh bên dưới

$ python3 example.py

0

Đã xảy ra với tôi với các thư mục utils. Tôi đã cố gắng để nhập thư mục này như:

from utils import somefile

utilsđã là một gói trong python. Chỉ cần thay đổi tên thư mục của bạn thành một cái gì đó khác nhau và nó sẽ hoạt động tốt.


0

Loại lỗi này xảy ra rất có thể là do xung đột phiên bản python. Ví dụ: nếu ứng dụng của bạn chỉ chạy trên python 3 và bạn cũng có python 2, thì tốt hơn là chỉ định phiên bản nào sẽ sử dụng. Ví dụ sử dụng

python3 .....

thay vì

python

0

Câu trả lời này áp dụng cho câu hỏi này nếu

  1. Bạn không muốn thay đổi mã của bạn
  2. Bạn không muốn thay đổi PYTHONPATH vĩnh viễn

Tạm thời sửa đổi PYTHONPATH

đường dẫn bên dưới có thể là tương đối

PYTHONPATH=/path/to/dir python script.py

0

nhập sys sys.path.append ('/ Users / {user} /L Library / Python / 3.7 / lib / python / site-packages') nhập ta


-1

Hủy bỏ pathlibvà cài đặt lại nó. Xóa pathlib trong sitepackagesthư mục và cài đặt lại gói pathlib bằng cách sử dụng lệnh pip:

pip install pathlib
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.