-m
triển khai ở runpy._run_module_as_main
. Bản chất của nó là:
mod_name, loader, code, fname = _get_module_details(mod_name)
<...>
exec code in run_globals
Mô-đun được biên dịch không có "đối tượng mã" được liên kết với nó sao cho câu lệnh 1 không thành công với ImportError("No code object available for <module>")
. Bạn cần phải mở rộng runpy - cụ thể, _get_module_details
- để làm cho nó hoạt động cho một mô-đun được biên dịch. Tôi đề nghị trả lại một đối tượng đang được xây dựng từ nói trên "import mod; mod.main()"
: (python 2.6.1)
code = loader.get_code(mod_name)
if code is None:
+ if loader.etc[2]==imp.C_EXTENSION:
+ code=compile("import %(mod)s; %(mod)s.main()"%{'mod':mod_name},"<extension loader wrapper>","exec")
+ else:
+ raise ImportError("No code object available for %s" % mod_name)
- raise ImportError("No code object available for %s" % mod_name)
filename = _get_filename(loader, mod_name)
(Cập nhật: cố định một lỗi trong chuỗi định dạng)
Bây giờ ...
C:\Documents and Settings\Пользователь>python -m pythoncom
C:\Documents and Settings\Пользователь>
Điều này vẫn không hoạt động đối với các mô đun dựng sẵn. Một lần nữa, bạn sẽ cần phải phát minh ra một số khái niệm về "đơn vị mã chính" cho chúng.
Cập nhật:
Tôi đã nhìn qua internals gọi từ _get_module_details
và có thể nói với sự tự tin rằng họ thậm chí không nỗ lực để lấy một đối tượng mã từ một mô-đun kiểu khác hơn imp.PY_SOURCE
, imp.PY_COMPILED
hoặc imp.PKG_DIRECTORY
. Vì vậy, bạn có để vá máy móc này theo cách này hoặc cách khác để -m
hoạt động. Python bị lỗi trước khi truy xuất bất kỳ thứ gì từ mô-đun của bạn (nó thậm chí không kiểm tra xem tệp dll có phải là mô-đun hợp lệ) hay không. Vì vậy, bạn không thể làm bất cứ điều gì bằng cách tạo nó theo cách đặc biệt.
Nguồn
2011-11-28 23:00:55
Bạn sử dụng công cụ gì, bạn đang cố gắng đạt được điều gì, nền tảng là gì? Bạn sử dụng bao nhiêu thư viện chuẩn? Là mô-đun của bạn và nguồn đóng, hoặc một cái gì đó chúng ta có thể nhìn vào? Tôi không thể giúp đỡ mà không có một số thông tin. – janislaw
Cảm ơn sự nhiệt tình nhưng vấn đề còn sâu sắc hơn so với câu hỏi của bạn. Module này được viết bằng C bằng cách sử dụng các phương thức Python chuẩn để thực hiện điều đó. Bắt đầu tại trang này để có được một ý tưởng: http://docs.python.org/extending/extending.html "Công cụ" là cơ chế Python chuẩn cho các phần mở rộng C, những gì tôi đang cố gắng đạt được là trong mô tả, tất cả các nền tảng, thư viện chuẩn không liên quan (mã trong C không Python), mô-đun là của tôi và nguồn mở và đủ phức tạp mà tôi khuyên bạn nên sử dụng mô-đun ví dụ từ trang tài liệu python. –
Bạn đã bao giờ sản xuất tệp thực thi được cố định trong Python chưa? Tùy thuộc vào nền tảng, nó bó với tất cả các mã thực thi nó cần để chạy. Tôi đã từng chuyển một chương trình python sang linux, và phải gửi libglib và libz cùng với tệp thực thi được đông lạnh. Trên Windows, OTOH có msvcrtxx.dll mà bạn có thể cần gửi. Thậm chí nếu bạn viết chương trình C với Python.lib được liên kết tĩnh, bạn cần phải đính kèm các thư viện động, để đánh bại mục đích tập tin đơn lẻ. – janislaw