Як включити зовнішній код 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

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
Помічна функція "включити" не працює, якщо ви хочете мати змінні у включеному файлі в області виклику "включати"
paulj

35

Якщо ви використовуєте:

import Math

тоді це дозволить вам використовувати функції Math, але ви повинні робити Math.Calculate, так що, очевидно, те, що ви не хочете.

Якщо ви хочете імпортувати функції модуля без необхідності їх префіксації, ви повинні чітко їх назвати, наприклад:

from Math import Calculate, Add, Subtract

Тепер ви можете посилатися на Обчислити, Додавати та Віднімати лише за їхніми іменами. Якщо ви хочете імпортувати ВСІ функції з Math, зробіть:

from Math import *

Однак ви повинні бути дуже обережними, роблячи це з модулями, вміст яких ви не впевнені. Якщо ви імпортуєте два модулі, що містять визначення для того ж імені функції, одна функція перезапише іншу, а вам ніхто не мудріший.


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 () поверне консоль або сценарії _ ім'я _, тоді як виконання test.dostuff () поверне ім'я модулів пітона.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.