2012-06-22 2 views
8

У меня есть модуль, который имеет обычнуюКак импортировать модуль как __main__?

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

идиомы.

Я хотел бы импортировать это из другого модуля и обмануть его в запуск этого кода. Есть ли способ сделать это?

Следует упомянуть, по причинам, по которым я не буду входить сюда, я не могу изменить код в импортированном модуле. Мне нужно каким-то образом изменить процедуру импорта, чтобы имя было основным при импорте, возможно, с использованием ihooks или аналогичного.

ответ

8

Существует, выполнить скрипт вместо того, чтобы импортировать его. Но я считаю это крайне хакерским решением.

Однако идеальный образец будет:

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

if __name__ == '__main__': 
    do_stuff() 

таким образом вы можете сделать:

from mymodule import do_stuff 
do_stuff() 

EDIT: Ответ после осветления на не будучи в состоянии изменить код модуля.

Я бы никогда не рекомендовал это в любом производственном коде, это решение «использовать на свой страх и риск».

import mymodule 

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

Спасибо, но я уточнил вопрос - я не могу изменить импортированный модуль, чтобы иметь весь код в такой функции do_stuff. – xorsyst

3

Поместите этот код в функцию и вызовите его из модуля, в который вы его импортируете.

def stuff(): 
    ... 

if __name__ == '__main__': 
    stuff() 

А затем в модуле вы импортируете его в:

import module 
module.stuff() 
+0

Спасибо, но я прояснил вопрос - я не могу изменить импортированный модуль, чтобы иметь весь код в функции вещи, как это , – xorsyst

0

Положите его в функцию:

def _main(): 
    do stuff 

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

Спасибо, но я уточнил вопрос: я не могу модифицировать импортированный модуль, чтобы иметь весь код в такой основной функции. – xorsyst

0

Код в основной строфы обычно никогда имеет смысл непосредственно работать. Если вы хотите запустить его, используйте subprocess, чтобы запустить его в другом интерпретаторе Python.

+0

Спасибо. В этом случае это происходит, и запуск его с помощью подпроцесса не решает мою проблему. – xorsyst

0

Вот пример основного модуля в Python:

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

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

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

Но вы можете также включить

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) 

в любом модуле вы хотели бы работать в качестве основного.

Например, если у вас есть библиотечный модуль, вы всегда можете использовать эту конструкцию для выполнения каких-то конкретных тестов.

+0

Спасибо, но я уточнил вопрос: я не могу изменить импортированный модуль, чтобы весь код был в такой основной функции. – xorsyst

7

Как указано в других ответах, это плохая идея, и вы должны решить проблему по-другому.

Несмотря на это, как Python делает это выглядит так:

import runpy 
result = runpy._run_module_as_main("your.module.name")) 
Смежные вопросы