2015-04-09 20 views
10

tôi có một dự án có cấu trúc như vậy:nhập không thành công khi chạy python dưới dạng tập lệnh, nhưng không phải trong iPython?

folder1 
     | 
     folder2 
      | 
      tests 

Tôi có __init__.py trong mỗi thư mục. Khi tôi ở trong thư mục mẹ của thư mục 1, tôi chạy iPython và làm

from folder1.folder2.tests.test1 import main 
main() 

mọi thứ hoạt động tốt. Tuy nhiên khi tôi chạy

python folder1/folder2/tests/test1.py 

tôi nhận được ImportError: Không có mô-đun tên folder1.folder2.file1, nơi tuyên bố nhập của tôi trong test1 là

from folder1.folder2.file1 import class1 

Confused về điều này - Tôi đoán nó là một vấn đề đường nhưng tôi không hiểu những gì là sai với mã của tôi (nhiều thiết lập tương tự trong các thư mục khác) và tại sao nó vẫn hoạt động trong iPython và không python chạy như một kịch bản.

Trả lời

8

Các module search path (python 3 docu) là khác nhau có và không có một tập tin kịch bản:

python tương tác thông dịch

(đi cho cả pythonipython)

$ python 
Python 2.7.3 (default, Dec 18 2014, 19:10:20) 
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import sys 
>>> print(sys.path) 
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/pymodules/python2.7/gtk-2.0', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', '/usr/lib/python2.7/dist-packages/ubuntuone-client', '/usr/lib/python2.7/dist-packages/ubuntuone-control-panel', '/usr/lib/python2.7/dist-packages/ubuntuone-couch', '/usr/lib/python2.7/dist-packages/ubuntuone-installer', '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol'] 
>>> 

Note mục đầu tiên là một chuỗi rỗng. Chuỗi trống là một đường dẫn tương đối tương đương với .. Các đường dẫn tương đối trong đường dẫn tìm kiếm mô-đun liên quan đến thư mục làm việc hiện tại của tiến trình thông dịch, vì vậy đây chỉ là thư mục làm việc hiện tại nơi bạn gọi trình thông dịch. (Mà trong trường hợp của bạn xảy ra để được thư mục gốc của dự án của bạn.)

thực hiện một tập tin script

$ echo 'import sys' > /tmp/pathtest.py 
$ echo 'print(sys.path)' >> /tmp/pathtest.py 
$ python /tmp/pathtest.py 
['/tmp', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/pymodules/python2.7/gtk-2.0', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', '/usr/lib/python2.7/dist-packages/ubuntuone-client', '/usr/lib/python2.7/dist-packages/ubuntuone-control-panel', '/usr/lib/python2.7/dist-packages/ubuntuone-couch', '/usr/lib/python2.7/dist-packages/ubuntuone-installer', '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol'] 

Lưu ý rằng ở đây, mục đầu tiên là đường dẫn tuyệt đối của thư mục chứa các tập tin kịch bản chúng tôi thông qua như một đối số.

+3

để cơ bản thêm 'sys nhập; sys.path = [''] + sys.path' vào tập lệnh của bạn – aforaudrey

+1

cũng không bị cám dỗ khi sử dụng 'sys.path.extend ([''])' (như tôi đã làm), vì thứ tự thực hiện một sự khác biệt. – gpano

4

Tôi gặp phải sự cố tương tự trong khi nhập thư viện có nhiều ký tự hoặc bất kỳ tùy thuộc vào mật độ. Vấn đề là tôi đã có một tên tập tin random.py trong thư mục dự án của tôi.

Numpy có random.py trong đó cho các hàm ngẫu nhiên của nó, nhưng việc nhập nó đã lấy random.py của thư mục dự án của tôi.

Giải pháp tốt nhất là không đặt tên bất kỳ tệp nào với tên mô-đun chuẩn của bất kỳ thư viện nào.

Thưởng thức .. :)

+0

Ôi Chúa ơi ... Cảm ơn rất nhiều! Tôi đã sử dụng tên "redmine" và cố nhập mô-đun redmine ... – QtRoS

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