2013-11-01 14 views
7

Tôi đang cố gắng tạo điểm nhập cho phương thức chính trong một trong các mô-đun python của mình và có vẻ như đang gặp sự cố khi nhập mô-đun nơi hàm đó hoạt động.trong quá trình load_entry_point trong Python

setup.py của tôi trông như thế này:

... 
setup(name="awesome-tool", 
     ..., 
     entry_points={ 
      'console_scripts' : [ 
       'awesome-tool = awesome_tool.awesome_tool:main' 
      ] 
     } 
) 

Dự án được tổ chức như thế này:

awesome_tool 
    |__ awesome_tool.py 
    |__ __init__.py 

Đó là awesome_tool.py có chứa một hàm gọi là main() mà tôi muốn làm cho có sẵn trong một tệp thi hành được gọi là awesome-tool. Khi thực thi setup.py, tất cả dường như hoạt động tốt. Tôi có thể bắt đầu một dấu nhắc python và làm

> import awesome_tool.awesome_tool 
> # (all good here) 

Nhưng khi tôi cố gắng gọi awesome-tool từ dòng lệnh, đây là những gì sẽ xảy ra:

Traceback (most recent call last): 
    File ".../virtualenvs/awesome-tool/bin/awesome-tool", line 9, in <module> 
    load_entry_point('awesome-tool==1.1.0', 'console_scripts', 'awesome-tool')() 
    File "build/bdist.macosx-10.9-intel/egg/pkg_resources.py", line 378, in load_entry_point 
    return get_distribution(dist).load_entry_point(group, name) 
    File "build/bdist.macosx-10.9-intel/egg/pkg_resources.py", line 2566, in load_entry_point 
    return ep.load() 
    File "build/bdist.macosx-10.9-intel/egg/pkg_resources.py", line 2260, in load 
    entry = __import__(self.module_name, globals(),globals(), ['__name__']) 
ImportError: No module named awesome_tool.awesome_tool 

gì? Không phải tôi chỉ có thể nhập khẩu này từ vỏ python? Tôi nghi ngờ rằng có điều gì đó buồn cười xảy ra với con đường python, nhưng tôi đã không thể chẩn đoán được vấn đề. Bất kỳ ý tưởng?

Các dòng có vấn đề trong awesome-tool thực thi được cung cấp bởi setup.py dường như sau:

from pkg_resources import load_entry_point 
load_entry_point("awesome-tool==1.1.0", "console_scripts", "awesome-tool")() 

Ngoài ra, tôi nhận ra rằng nó rất kỳ lạ để có cả một gói và mô-đun phần cùng tên ("awesome_tool"), nhưng đây là mã tôi đã kế thừa và tôi không muốn phá vỡ khả năng tương thích ngược với đổi tên, mặc dù điều này có thể là không thể tránh khỏi trong tương lai. Nếu có thể, tôi muốn giữ tên như bây giờ.

+0

Làm thế nào để bạn "gọi 'tuyệt vời-tool' từ dòng lệnh"? Thư mục làm việc hiện tại là gì khi bạn làm như vậy? Thư mục làm việc khi bạn thử chạy Python là gì? – abarnert

+0

Tôi đang gọi thư mục 'awesome-tool' ở phía trên nội dung gói (ví dụ' awesome_tool/.. ') và trình thông dịch python trong cùng một vị trí, nhưng khi tôi' cd' vào một thư mục khác và thử trình thông dịch python trên một lần nữa , Tôi nhận được 'ImportError'. Đó là tiến bộ! Cảm ơn bạn. – llovett

Trả lời

2

Có vẻ như bạn chưa cài đặt gói theo bất kỳ cách nào, vì vậy bạn đang dựa vào nó xảy ra để ngồi trong thư mục làm việc hiện tại hoặc một số thư mục khác mà bạn đã thêm vào sys.path.

Bạn không cho chúng tôi biết cách bạn "gọi awesome-tool từ dòng lệnh", nhưng tôi đoán là bạn đang thực hiện nó từ một thư mục hoạt động khác.

Ví dụ:

$ cd ~/virtualenvs/awesome-tool 
$ python 
>>> import awesometool.awesometool 
>>> ^D 
$ cd .. 
$ python 
>>> import awesometool.awesometool 
ImportError: No module named awesome_tool.awesome_tool 
$ cd awesome-tool 
$ python ./bin/awesome-tool 
<everything works> 
$ cd bin 
$ python awesome-tool 
ImportError: No module named awesome_tool.awesome_tool 
+0

Tôi đã chạy 'setup.py', nhưng sau khi xem xét kỹ hơn, tôi thấy rằng gói cài đặt vào' site-packages' của tôi là 'awesome-tool' (không thể nhập được ... tuyệt vời). Gốc của vấn đề được thể hiện trong câu hỏi này là những gì bạn đang chỉ ra ở đây, mà gọi python từ thư mục phía trên gói sai làm cho nó xuất hiện như thể gói được cài đặt đúng khi nó không được. Cảm ơn bạn. – llovett

+0

@llovett: Vâng, tên tệp và mô-đun phải là số nhận dạng hợp lệ hoặc chúng không hữu ích. Bí quyết thông thường là thay thế '_' cho tất cả các ký tự không định danh, vì vậy, ví dụ, sau khi bạn' pip install more-itertools config-tree' bạn có thể 'import more_itertools, config_tree'. Tôi nghĩ rằng điều này được thảo luận ở đâu đó trong [Phân phối mô-đun Python] (http://docs.python.org/3/distutils/index.html) hoặc tài liệu hướng dẫn của Hitchhikers để đóng gói, nhưng tất cả mọi người tôi biết bị cắn bởi vấn đề đó lần đầu tiên họ tạo ra một gói với một tên dài. – abarnert

+0

Tôi có một vấn đề tương tự và nó đã kết thúc được rằng tôi đã không thực sự cài đặt gói của tôi. Chạy 'pip install .' đã sửa nó cho tôi. – wulfgarpro

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