2010-04-17 26 views
19

Tôi đang cố gắng sử dụng Emacs làm trình chỉnh sửa python và nó hoạt động tốt khi tôi đánh giá (Cc Cc) chỉ một tệp duy nhất nhưng khi tôi đánh giá tệp nhập một tệp khác trong cùng thư mục, tôi nhận được một lỗi nói rằng không thể nhập tệp.Vấn đề nhập chế độ Python

Có ai biết giải pháp khác không?

Cảm ơn trước

chỉnh sửa: Btw, tôi đang sử dụng Emacs23 trên máy Ubuntu.

Các lỗi được,

ImportError: No module named hlutils 
+0

Tôi không cố gắng không tôn trọng bạn, tôi chỉ nói điều này bởi vì tôi chưa bao giờ gặp vấn đề như thế này, và tôi chỉ muốn chắc chắn về bạn, nhưng khi bạn thử chạy tập tin bình thường với python, bên ngoài emacs, nó chạy đúng không? – Nikwin

+0

Ngoài ra, hãy thử chạy mã python sau: nhập os in os.listdir ('.') và xem thư mục nào nó in ra. – Nikwin

+0

Vâng, tôi đã viết nó trong Scite và nó hoạt động. Tôi đang chuyển sang emacs bởi vì nó một chút năng động hơn (nó có một repl để kiểm tra mã ra một cách nhanh chóng trong khi scite chỉ chạy một lệnh python và hiển thị đầu ra). Không lấy tất nhiên hành vi phạm tội :) – smith

Trả lời

0

Mở một terminal và gõ emacs -q. Điều này bắt đầu một emacs mà không cần tải tệp init (.emacs). Liệu hành vi tương tự có xảy ra không? Nếu không, thì điều đó có nghĩa là có sự cố trong tệp .emacs của bạn.

Edit:

Khi bạn chạy một kịch bản sử dụng C-c C-c từ bên trong chế độ Python Emacs', thư mục chứa các kịch bản là không bổ sung vào đầu sys.path. Tôi đã tìm thấy điều này bằng cách đặt

import sys 
print sys.path 

ở đầu tập lệnh thử nghiệm. Đây là lý do tại sao Python không tìm thấy các mô-đun khác nằm trong cùng một thư mục.

Khi bạn chạy tập lệnh từ dòng lệnh, Python sẽ thêm thư mục chứa tập lệnh vào sys.path. Đó là lý do tại sao cùng một kịch bản hoạt động từ dòng lệnh.

Bạn có thể khắc phục điều này bằng cách chỉnh sửa tập tin ~/.bashrc của bạn và thêm

export PYTHONPATH=/path/to/Python/scripts 

Sau khi lưu ~/.bashrc, emacs gần và bắt đầu nó một lần nữa để đảm bảo sự thay đổi để .bashrc có hiệu lực.

+0

nope, không hoạt động – smith

+0

Thư mục có phải là thư mục chứa thư mục của tôi hay nó là một thư mục đặc biệt trong python? tôi đã thử đường dẫn/đến/python là/usr/share/python nhưng nó không hoạt động. xin lỗi bạn mới với linux, trong windows tôi biết rằng thư mục python của tôi là trong c:/python25, nhưng linux có nhiều thư mục có tên python do đó tôi không thể thực hiện chính xác – smith

+0

@smith, xin lỗi tôi nên có được nhiều hơn thông thoáng. Thay đổi '/ path/to/Python/scripts' thành thư mục chứa' hlutils.py'. – unutbu

0

Tôi thực sự khá xấu với emacs lisp, và tôi chưa bao giờ sử dụng Ubuntu, vì vậy sau đây có thể yêu cầu một số tinh chỉnh, nhưng nếu mã chạy tốt từ vỏ, tại sao không chỉ thiết lập emacs để chạy lệnh shell? Chỉ cần đặt:

(defun shell-compile() 
    (interactive) 
    (shell-command (concat "python " (buffer-file-name)))) 

(add-hook 'python-mode-hook 
      (lambda() (local-set-key (kbd "\C-c\C-c") 'shell-compile))) 

vào tệp .emacs của bạn. Phải có nhiều cách sạch hơn để làm điều đó, nhưng điều này ít nhất sẽ giúp bạn làm việc.

+0

Cảm ơn, điều này hoạt động tốt. Nhưng thay vì thực hiện một lệnh shell nếu nó bắt đầu một trình thông dịch python và gửi nội dung đệm tới trình thông dịch python thì nó sẽ rất tuyệt, đó là một tính năng mà chế độ python cung cấp mà tôi thực sự muốn, không thể làm cho nó hoạt động được;) – smith

1

Tôi nhập mô-đun cục bộ từ cùng một thư mục chỉ khi sử dụng py-execute-buffer.

Sự cố của bạn có thể liên quan đến cách py-execute-buffer hoạt động: nó lưu bộ đệm vào tệp tmp (trong thư mục py-temp-directory) và sau đó chuyển tệp này sang Python. Trong trường hợp của bạn, hệ thống có thể bị ảnh hưởng bởi thư mục tệp tạm thời.

Một khía cạnh khác: py-execute-buffer thực hiện những việc khác nhau với tệp tmp tùy thuộc vào việc liệu bộ đệm thông dịch Python có tồn tại hay không. Hãy thử trường hợp của bạn với một thông dịch viên đang chạy và không có (chỉ cần giết bộ đệm thông dịch viên).

16

Tôi nghĩ rằng vấn đề là cách chế độ python của Emacs chạy Python.Nếu tôi gõ M-x run-python, sau đó tôi thấy điều này:

>>> import sys 
>>> '' in sys.path 
False 
>>> 

trong khi nếu tôi chạy thông dịch viên python từ vỏ, tôi thấy:

>>> import sys 
>>> '' in sys.path 
True 
>>> 

này có vẻ là do đoạn mã sau vào run-python từ progmodes/python.el:

(let* ((cmdlist 
    (append (python-args-to-list cmd) 
     '("-i" "-c" "import sys; sys.path.remove('')"))) 

mà không có ý kiến, và sự xâm nhập ChangeLog hữu ích sau đây:

2008-08-24 Romain Francoise <[email protected]> 

     * progmodes/python.el (run-python): Remove '' from sys.path. 

Tôi có thể nói đây là lỗi trong Emacs. Dưới đây là một cách giải quyết mà bạn có thể đặt trong emacs tập tin của bạn:

(defun python-reinstate-current-directory() 
    "When running Python, add the current directory ('') to the head of sys.path. 
For reasons unexplained, run-python passes arguments to the 
interpreter that explicitly remove '' from sys.path. This means 
that, for example, using `python-send-buffer' in a buffer 
visiting a module's code will fail to find other modules in the 
same directory. 

Adding this function to `inferior-python-mode-hook' reinstates 
the current directory in Python's search path." 
    (python-send-string "sys.path[0:0] = ['']")) 

(add-hook 'inferior-python-mode-hook 'python-reinstate-current-directory) 
+1

Theo http://twistedmatrix.com/pipermail/cvstoys-list/2003q3/000114.html - đó là "bản sửa lỗi bảo mật", các thông tin khác tại đây: http://old.nabble.com/python.el: -why-remove-% 27% 27-from-sys.path - td22502790.html –

1

Tôi có cùng một vấn đề, nếu bạn không muốn chỉnh sửa emacs của bạn tập tin bạn có thể đặt này vào đầu script của bạn:

import sys 
import os 
sys.path.append(os.getcwd()) 

Nó thêm dirrectory làm việc hiện tại để sys.path của bạn tạm thời,

+1

Lưu ý: Bạn có thể muốn thêm thư mục làm việc hiện tại vào đầu đường dẫn của bạn với sys.path.insert (0, os.getcwd()) – kkurian

12

Kể từ khi câu trả lời trước với trang này được đăng một tùy chọn đã được thực hiện có sẵn để thay đổi hành vi mặc định (loại bỏ các thư mục hiện tại từ đường) để bao gồm cwd trong đường dẫn.

Vì vậy, một đơn giản

(setq python-remove-cwd-from-path nil) 

trong emacs của bạn nên sửa lỗi này.

+0

Không hoạt động với tôi – cgl

+0

Bạn cũng có thể đặt biến này trong tệp **. Emacs ** của bạn thông qua 'Mx tùy biến biến [RET] python-remove-cwd-from-path [RET]'. – DavidRR

0

cải thiện một câu trả lời hiện trên: eval này trong bộ đệm đầu của bạn để thêm cwd trở lại PYTHONPATH

(defun python-reinstate-current-directory() 
    (python-send-string "sys.path[0:0] = ['']")) 
(add-hook 'inferior-python-mode-hook 'python-reinstate-current-directory) 
0

tôi đã đưa ra một giải pháp rất dễ dàng. Chỉ cần thêm vào .emacs các dòng sau đây của bạn:

(setenv "PYTHONPATH" "/path/to/where/modules/are") 

Nó sẽ thiết lập giá trị của biến môi trường có tên biến để giá trị.

Bây giờ, gõ vào emacs python phiên dịch ...

>>> import sys 
>>> sys.path 
>>> ['/path/to/where/modules/are', '/usr/share/emacs/23.1/etc' ... ] 

... và công việc tùy chỉnh import s.

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