2012-06-22 19 views
8

Tôi có một mô-đun có các thông sốLàm cách nào để nhập mô-đun là __main__?

if __name__ == '__main__': 
    do stuff... 

thành ngữ mới nhất.

Tôi muốn nhập từ mô-đun khác và đánh lừa nó để chạy mã đó. Có cách nào để làm điều này không?

Tôi nên đề cập, vì lý do tôi sẽ không đi vào đây, tôi không ở vị trí để thay đổi mã trong mô-đun đã nhập. Tôi cần phải bằng cách nào đó sửa đổi các thủ tục nhập khẩu để tên của nó là chính khi nhập khẩu, có lẽ bằng cách sử dụng ihooks hoặc tương tự.

Trả lời

8

Có, thực thi kịch bản thay vì nhập khẩu nó. Nhưng tôi coi đây là một giải pháp cực kỳ đáng sợ.

Tuy nhiên mô hình lý tưởng sẽ là:

def do_stuff(): 
    ... stuff happens ... 

if __name__ == '__main__': 
    do_stuff() 

cách mà bạn có thể làm:

from mymodule import do_stuff 
do_stuff() 

EDIT: trả lời sau khi làm rõ về việc không thể chỉnh sửa mã module.

Tôi sẽ không bao giờ đề xuất điều này trong bất kỳ mã sản xuất nào, đây là giải pháp "sử dụng rủi ro riêng".

import mymodule 

with open(os.path.splitext(mymodule.__file__)[0] + ".py") as fh: 
    exec fh.read() 
+0

Cảm ơn, nhưng tôi đã làm rõ câu hỏi - Tôi không thể sửa đổi mô đun đã nhập để có tất cả mã trong hàm do_stuff như vậy. – xorsyst

3

Đặt mã đó vào một hàm và gọi mã đó từ mô-đun bạn cũng nhập mã đó vào.

def stuff(): 
    ... 

if __name__ == '__main__': 
    stuff() 

Và sau đó trong các mô-đun bạn đang nhập nó vào:

import module 
module.stuff() 
+0

Cảm ơn, nhưng tôi đã làm rõ các câu hỏi - Tôi không thể sửa đổi các mô-đun nhập khẩu để có tất cả các mã trong một chức năng cụ như thế . – xorsyst

0

Đặt nó trong một hàm:

def _main(): 
    do stuff 

if __name__ == '__main__': 
    main() 
+0

Cảm ơn, nhưng tôi đã làm rõ câu hỏi - Tôi không thể sửa đổi mô-đun đã nhập để có tất cả mã trong một chức năng chính như vậy. – xorsyst

0

Mã trong một đoạn thơ chính thường bao giờ làm cho tinh thần để chạy trực tiếp. Nếu bạn muốn chạy nó sau đó sử dụng subprocess để chạy nó trong một trình thông dịch Python khác.

+0

Cảm ơn. Trong dịp này nó, và chạy nó với subprocess không giải quyết vấn đề của tôi. – xorsyst

0

Dưới đây là một ví dụ về một mô-đun chính bằng Python:

#! /usr/bin/env python 
import sys 
import os 

def main(arg1, arg2, arg3): 
    print(arg1, arg2, arg3) 

if __name__ == "__main__": 
    main(*sys.argv) 

Nhưng bạn cũng có thể bao gồm

def main(): 
    #The module contains Python code specific to the library module, 
    #like tests, and follow the module with this: 

if __name__ == "__main__": 
    main(*sys.argv) 

trong bất kỳ mô-đun bạn muốn chạy như chính.

Ví dụ: nếu bạn có mô-đun thư viện, bạn luôn có thể sử dụng cấu trúc này để thực thi một cái gì đó cụ thể như kiểm tra.

+0

Cảm ơn, nhưng tôi đã làm rõ câu hỏi - Tôi không thể sửa đổi mô-đun đã nhập để có tất cả mã trong một chức năng chính như vậy. – xorsyst

7

Như đã nêu trong các câu trả lời khác, đây là một ý tưởng tồi và bạn nên giải quyết vấn đề theo cách khác.

Bất kể, cách Python có phải nó là như thế này:

import runpy 
result = runpy._run_module_as_main("your.module.name")) 
Các vấn đề liên quan