Как включить внешний код Python для использования в других файлах?

117

Если у вас есть набор методов в файле, есть ли способ включить эти файлы в другой файл, но вызвать их без префикса (т.е. префикса файла)?

Итак, если у меня есть:

[Math.py]
def Calculate ( num )

Как мне это назвать:

[Tool.py]
using Math.py

for i in range ( 5 ) :
    Calculate ( i )
Джоан Венге
источник

Ответы:

154

Вам нужно будет импортировать другой файл как такой модуль:

import Math

Если вы не хотите ставить перед своей Calculateфункцией имя модуля, сделайте следующее:

from Math import Calculate

Если вы хотите импортировать все члены модуля, сделайте следующее:

from Math import *

Изменить: вот хорошая глава из « Dive Into Python» , в которой более подробно рассматривается эта тема.

Эндрю Хэйр
источник
9
Стоит отметить , что from Math import *это не рекомендуется .
naught101
1
Вам может быть интересен impмодуль и магический звонок __import__.
Витольд С.
Кто-то забыл продлить свой домен: \
Spechal 05
48

Просто напишите команду "включить":

import os

def include(filename):
    if os.path.exists(filename): 
        execfile(filename)


include('myfile.py')

@Deleet:

Замечание @bfieck верное, для совместимости с python 2 и 3 вам необходимо:

Python 2 и 3: альтернатива 1

from past.builtins import execfile

execfile('myfile.py')

Python 2 и 3: альтернатива 2

exec(compile(open('myfile.py').read()))
Луис
источник
3
Есть ли причина делать это заново from module import *? Кроме того, если файл, который вы вызываете, имеет код в теле, этот код будет запущен, если вы это сделаете.
naught101
4
@ naught101: Это цель: запустить код, чего не происходит при импорте. Обычно это просто определение переменных.
Луи
2
@Deleet python 3 не имеетexecfile
bfieck
7
На самом деле у python 3 есть другая подпись, compile()чем упомянуто. Итак, правильные Python 2 и 3: альтернатива 2 будет:exec(compile(source=open('myfile.py').read(), filename='myfile.py', mode='exec'))
TriAnMan
3
Вспомогательная функция include не работает, если вы хотите, чтобы переменные во включенном файле находились в области видимости вызывающего объекта include
Пол
35

Если вы используете:

import Math

тогда это позволит вам использовать функции Math, но вы должны использовать Math.Calculate, так что, очевидно, это то, чего вы не хотите.

Если вы хотите импортировать функции модуля без префикса, вы должны явно назвать их, например:

from Math import Calculate, Add, Subtract

Теперь вы можете ссылаться на Calculate, Add и Subtract только по их именам. Если вы хотите импортировать ВСЕ функции из Math, выполните:

from Math import *

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

ryeguy
источник
1

Я обнаружил, что модуль проверки Python очень полезен

Например, с teststuff.py

import inspect

def dostuff():
    return __name__

DOSTUFF_SOURCE = inspect.getsource(dostuff)

if __name__ == "__main__":

    dostuff()

И из другого скрипта или консоли python

import teststuff

exec(DOSTUFF_SOURCE)

dostuff()

И теперь dostuff должен быть в локальной области видимости, и dostuff () вернет консоль или скрипты _ name _, тогда как выполнение test.dostuff () вернет имя модуля python.

whardier
источник