2015-07-08 13 views
11

Gần đây tôi gặp sự cố với Trình nhập khẩu trăn, nơi mô-đun được tìm thấy khi chạy trên máy tính cục bộ của tôi nhưng không tìm thấy trên máy chủ CI. Tôi đã giải quyết vấn đề này bằng cách hoán đổi sys.path.append(path) trong tập lệnh của tôi với sys.path.insert(0, path) trong đó path là vị trí mô-đun chuỗi.Ảnh hưởng của việc sử dụng sys.path.insert (0, đường dẫn) và sys.path (phụ thêm) khi nạp mô-đun

Vì đây là mô-đun của tôi chứ không phải gói cài đặt (related question), tại sao thứ tự đường dẫn khắc phục sự cố này?

+0

Bản sao có thể có của [Tại sao sử dụng sys.path.append (đường dẫn) thay vì sys.path.insert (1, đường dẫn)?] (Http://stackoverflow.com/questions/10095037/why-use-sys- Module-appendpath-thay-của-sys-path-insert1-path) – CrandellWS

Trả lời

9

Vì python kiểm tra trong các thư mục theo thứ tự tuần tự bắt đầu từ thư mục đầu tiên trong danh sách sys.path, cho đến khi tìm thấy tệp .py mà nó đang tìm kiếm.

Lý tưởng nhất, thư mục hiện tại hoặc thư mục của tập lệnh luôn là phần tử đầu tiên trong danh sách, trừ khi bạn sửa đổi nó, như bạn đã làm. Từ documentation -

As initialized upon program startup, the first item of this list, path[0], is the directory containing the script that was used to invoke the Python interpreter. If the script directory is not available (e.g. if the interpreter is invoked interactively or if the script is read from standard input), path[0] is the empty string, which directs Python to search modules in the current directory first. Notice that the script directory is inserted before the entries inserted as a result of PYTHONPATH.

Vì vậy, có lẽ hầu hết, bạn đã có một tập tin .py với tên giống như các module bạn đã cố gắng nhập từ, trong thư mục hiện (trong đó kịch bản đã được điều hành từ).

Ngoài ra, một điều cần lưu ý về ImportError s, cho phép nói những lỗi nhập khẩu nói - ImportError: No module named main - nó không có nghĩa là main.py được ghi đè, không có nếu điều đó được ghi đè chúng tôi sẽ không có vấn đề cố gắng để đọc nó. Một số mô-đun của nó ở trên này đã được ghi đè bằng a. py hoặc một số tệp khác.

Ví dụ -

cấu trúc thư mục của tôi trông như thế nào -

- test 
    - shared 
     - __init__.py 
     - phtest.py 
    - testmain.py 

Bây giờ Từ testmain.py, tôi gọi from shared import phtest, nó hoạt động tốt.

Bây giờ cho phép nói rằng tôi giới thiệu một shared.py trong test directory`, ví dụ -

- test 
    - shared 
     - __init__.py 
     - phtest.py 
    - testmain.py 
    - shared.py 

Bây giờ khi tôi cố gắng làm from shared import phtest từ testmain.py, tôi sẽ nhận được lỗi -

ImportError: cannot import name 'phtest' 

Như bạn có thể thấy ở trên, tệp gây ra sự cố là shared.py, không phải là phtest.py.

+0

Module của tôi là một thứ gì đó, tôi đã thử thay đổi nó thành something.engine để xem đây có phải là vấn đề không, tuy nhiên tôi vẫn có ImportError, điều này khiến tôi nghĩ rằng đó không phải là một cuộc đụng độ tên/tập tin mô-đun. –

+0

Lỗi nhập là gì? –

+1

Dòng cuối cùng của truy nguyên là "ImportError: Không có module nào có tên chính" –

6

Tôi khá mới bắt đầu bằng Python và tôi thấy câu trả lời của Anand là rất tốt nhưng khá phức tạp đối với tôi, vì vậy tôi cố gắng tái cấu trúc:

1) insertappend phương pháp này không cụ thể để sys.path và như trong các ngôn ngữ khác họ thêm một mục vào một danh sách hoặc mảng và:
* append(item) thêm item đến cuối danh sách,
* insert(n, item) chèn item ở vị trí thứ n trong danh sách (0 lúc đầu, 1 sau yếu tố đầu tiên, v.v. ...).

2) Như Anand đã nói, python tìm kiếm tệp nhập trong mỗi thư mục của đường dẫn theo thứ tự đường dẫn, vì vậy:
* Nếu bạn không có xung đột tên tệp, thứ tự của đường dẫn không có tác động,
* Nếu bạn chăm sóc một chức năng đã được xác định trong đường dẫn và bạn sử dụng append để thêm đường dẫn của mình, bạn sẽ không nhận được chức năng của mình nhưng chức năng được xác định trước.

Nhưng tôi nghĩ tốt hơn nên sử dụng append chứ không phải insert để không làm quá tải hành vi chuẩn của Python và sử dụng tên không mơ hồ cho tệp và phương pháp của bạn.

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