2009-04-03 2 views
101

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

Так что, если у меня есть:

[Math.py] 
def Calculate (num) 

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

[Tool.py] 
using Math.py 

for i in range (5) : 
    Calculate (i) 

ответ

142

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

import Math 

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

from Math import Calculate 

Если вы хотите импортировать все члены модуля затем сделать это:

from Math import * 

Редактировать:Here is a good chapter от Dive Into Python, который идет немного более подробно на эту тему.

+5

Стоит отметить, что 'from Math import * '[не рекомендуется] (https://www.python.org/dev/peps/pep-0008/#imports). – naught101

+1

Вам может быть интересен модуль 'imp' и магический вызов' __import__'. –

32

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

import Math 

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

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

from Math import Calculate, Add, Subtract 

Теперь вы можете ссылаться на Calculate, Добавить и Вычесть только по их именам. Если вы хотите импортировать все функции из Math, сделайте следующее:

from Math import * 

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

37

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

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())) 
+2

Есть ли причина сделать это над 'из импорта модуля?'? Кроме того, если файл, который вы вызываете, имеет код в теле, этот код будет запущен, если вы это сделаете. – naught101

+4

@ naught101: Это цель: запустить код, чего не происходит с импортом. Узумно это просто определение переменных. – Louis

+0

Это не работает для меня. in include (filename) 1 def include (filename): 2 if os.path.exists (filename): ----> 3 exec (имя файла) в () NameError: название 'тест' не определен Запуск IPython 3.4. – Deleet

0

Я нашел питон инспектировать модуль очень полезным

Например, с TestStuff.ру

import inspect 

def dostuff(): 
    return __name__ 

DOSTUFF_SOURCE = inspect.getsource(dostuff) 

if __name__ == "__main__": 

    dostuff() 

И из другого сценария или консоли питона

import teststuff 

exec(DOSTUFF_SOURCE) 

dostuff() 

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

Смежные вопросы