我如何导入其他Python文件?
我该如何在Python中导入文件呢?我想导入:
- 一个文件(比如说
file.py
) - 一个文件夹
- 在运行时根据用户输入动态导入一个文件
- 文件中的某个特定部分(比如说一个单独的函数)
23 个回答
第一种情况
你想在文件 B.py
中导入文件 A.py
,这两个文件在同一个文件夹里,像这样:
.
├── A.py
└── B.py
你可以在文件 B.py
中这样做:
import A
或者
from A import *
或者
from A import THINGS_YOU_WANT_TO_IMPORT_IN_A
这样你就可以在文件 B.py
中使用文件 A.py
的所有功能了。
第二种情况
你想在文件 B.py
中导入文件 folder/A.py
,这两个文件不在同一个文件夹里,像这样:
.
├── B.py
└── folder
└── A.py
你可以在文件 B.py
中这样做:
import folder.A
或者
from folder.A import *
或者
from folder.A import THINGS_YOU_WANT_TO_IMPORT_IN_A
这样你就可以在文件 B.py
中使用文件 A.py
的所有功能了。
总结
- 在第一种情况中,文件
A.py
是一个模块,你在文件B.py
中导入它,使用的语法是import module_name
。 - 在第二种情况中,
folder
是一个包,里面包含了模块A.py
,你使用的语法是import package_name.module_name
。
想了解更多关于包和模块的信息,可以参考这个 链接。
导入Python文件的方法有很多,每种都有优缺点。
不要急着选择第一个能用的导入方法,否则等你发现不合适时,就得重写代码了。
我会先讲解最简单的例子#1,然后再讲解最专业、最强大的例子#7。
例子1:用Python解释器导入一个Python模块:
把这个放在 /home/el/foo/fox.py 里:
def what_does_the_fox_say(): print("vixens cry")
进入Python解释器:
el@apollo:/home/el/foo$ python Python 2.7.3 (default, Sep 26 2013, 20:03:06) >>> import fox >>> fox.what_does_the_fox_say() vixens cry >>>
你通过Python解释器导入了fox,并在fox.py中调用了函数
what_does_the_fox_say()
。
例子2:在脚本中使用 execfile
或者 (exec
在Python 3中) 来执行另一个Python文件:
把这个放在 /home/el/foo2/mylib.py 里:
def moobar(): print("hi")
把这个放在 /home/el/foo2/main.py 里:
execfile("/home/el/foo2/mylib.py") moobar()
运行这个文件:
el@apollo:/home/el/foo$ python main.py hi
函数moobar从mylib.py中导入,并在main.py中可用。
例子3:使用from ... import ...功能:
把这个放在 /home/el/foo3/chekov.py 里:
def question(): print "where are the nuclear wessels?"
把这个放在 /home/el/foo3/main.py 里:
from chekov import question question()
这样运行:
el@apollo:/home/el/foo3$ python main.py where are the nuclear wessels?
如果你在chekov.py中定义了其他函数,除非你使用
import *
,否则它们是不可用的。
例子4:如果导入的文件在不同的文件位置,导入riaa.py:
把这个放在 /home/el/foo4/stuff/riaa.py 里:
def watchout(): print "computers are transforming into a noose and a yoke for humans"
把这个放在 /home/el/foo4/main.py 里:
import sys import os sys.path.append(os.path.abspath("/home/el/foo4/stuff")) from riaa import * watchout()
运行它:
el@apollo:/home/el/foo4$ python main.py computers are transforming into a noose and a yoke for humans
这会从不同目录的外部文件中导入所有内容。
例子5:使用 os.system("python yourfile.py")
import os
os.system("python yourfile.py")
例子6:通过Python启动钩子导入你的文件:
更新:这个例子以前在Python2和3中都能用,但现在只在Python2中有效。Python3去掉了这个用户启动钩子功能,因为一些低水平的Python库作者滥用它,把他们的代码不礼貌地注入到全局命名空间中,影响了用户定义的程序。如果你想在Python3中使用这个,你得更有创意。如果我告诉你怎么做,Python开发者会禁用这个功能,所以你得自己想办法。
查看: https://docs.python.org/2/library/user.html
把这段代码放到你的家目录下的 ~/.pythonrc.py
中:
class secretclass:
def secretmessage(cls, myarg):
return myarg + " is if.. up in the sky, the sky"
secretmessage = classmethod( secretmessage )
def skycake(cls):
return "cookie and sky pie people can't go up and "
skycake = classmethod( skycake )
把这段代码放到你的main.py中(可以放在任何地方):
import user
msg = "The only way skycake tates good"
msg = user.secretclass.secretmessage(msg)
msg += user.secretclass.skycake()
print(msg + " have the sky pie! SKYCAKE!")
运行它,你应该得到这个:
$ python main.py
The only way skycake tates good is if.. up in the sky,
the skycookie and sky pie people can't go up and have the sky pie!
SKYCAKE!
如果你在这里遇到错误: ModuleNotFoundError: No module named 'user'
,那说明你在使用Python3,默认情况下禁用了启动钩子。
这个概念的来源是: https://github.com/docwhat/homedir-examples/blob/master/python-commandline/.pythonrc.py 给个赞吧。
例子7:最强大:用简单的导入命令导入Python文件:
- 创建一个新目录
/home/el/foo5/
- 创建一个新目录
/home/el/foo5/herp
在herp下创建一个空文件,命名为
__init__.py
:el@apollo:/home/el/foo5/herp$ touch __init__.py el@apollo:/home/el/foo5/herp$ ls __init__.py
在herp下创建一个新目录 /home/el/foo5/herp/derp
在derp下,再创建一个
__init__.py
文件:el@apollo:/home/el/foo5/herp/derp$ touch __init__.py el@apollo:/home/el/foo5/herp/derp$ ls __init__.py
在 /home/el/foo5/herp/derp 下创建一个新文件,叫
yolo.py
,把这个放进去:def skycake(): print "SkyCake evolves to stay just beyond the cognitive reach of " + "the bulk of men. SKYCAKE!!"
关键时刻,创建一个新文件
/home/el/foo5/main.py
,把这个放进去:from herp.derp.yolo import skycake skycake()
运行它:
el@apollo:/home/el/foo5$ python main.py SkyCake evolves to stay just beyond the cognitive reach of the bulk of men. SKYCAKE!!
空的
__init__.py
文件告诉Python解释器,这个目录是可以被导入的包。
如果你想看看我关于如何包含目录下所有.py文件的帖子,可以查看这里: https://stackoverflow.com/a/20753073/445131
importlib
是在 Python 3 中新增的一个功能,可以用来以编程的方式导入模块。
import importlib
moduleName = input('Enter module name:')
importlib.import_module(moduleName)
在使用时,moduleName
后面不要加 .py 后缀。这个函数还有一个 package
参数,用于相对导入。
在 Python 2.x 中:
- 只需要用
import file
,同样不加 .py 后缀 - 如果想把一个文件夹标记为包,可以在里面放一个空的
__init__.py
文件 - 你还可以使用
__import__
函数,它接受模块名(不带后缀)作为字符串参数
pmName = input('Enter module name:')
pm = __import__(pmName)
print(dir(pm))
输入 help(__import__)
可以获取更多详细信息。