如何包括外部Python代码以在其他文件中使用?


117

如果文件中有一组方法,是否可以将这些文件包含在另一个文件中,但不带任何前缀(即文件前缀)调用它们?

所以,如果我有:

[Math.py]
def Calculate ( num )

我怎么这样称呼它:

[Tool.py]
using Math.py

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

Answers:


154

您将需要将其他文件作为模块导入,如下所示:

import Math

如果您不想在Calculate函数名称前加上模块名称,请执行以下操作:

from Math import Calculate

如果要导入模块的所有成员,请执行以下操作:

from Math import *

编辑: 这是Dive Into Python 的精彩一章,在该主题上有更深入的介绍。


9
值得注意的from Math import *不建议这样做
naught101

1
您可能会有趣的imp模块和魔术调用__import__
Vitold S.

有人忘记续订域名:\
Spechal

48

只需编写“ include”命令:

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'2015-2-10

4
@ naught101:这是目标:运行代码,导入不会发生。通常,它只是定义变量。
路易(Louis)

2
@Deleet巨蟒-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导入ALL函数,请执行以下操作:

from Math import *

但是,对不确定内容的模块执行此操作时应非常小心。如果导入两个包含相同功能名称定义的模块,则一个功能将覆盖另一个功能,而没有一个则更明智。


1

我发现python inspect模块非常有用

例如,使用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模块名称。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.