我如何导入其他Python文件?

1261 投票
23 回答
2932309 浏览
提问于 2025-04-15 19:48

我该如何在Python中导入文件呢?我想导入:

  1. 一个文件(比如说 file.py
  2. 一个文件夹
  3. 在运行时根据用户输入动态导入一个文件
  4. 文件中的某个特定部分(比如说一个单独的函数)

23 个回答

182

第一种情况

你想在文件 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

想了解更多关于包和模块的信息,可以参考这个 链接

1469

导入Python文件的方法有很多,每种都有优缺点。

不要急着选择第一个能用的导入方法,否则等你发现不合适时,就得重写代码了。

我会先讲解最简单的例子#1,然后再讲解最专业、最强大的例子#7。

例子1:用Python解释器导入一个Python模块:

  1. 把这个放在 /home/el/foo/fox.py 里:

    def what_does_the_fox_say():
      print("vixens cry")
    
  2. 进入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文件:

  1. 把这个放在 /home/el/foo2/mylib.py 里:

    def moobar():
      print("hi")
    
  2. 把这个放在 /home/el/foo2/main.py 里:

    execfile("/home/el/foo2/mylib.py")
    moobar()
    
  3. 运行这个文件:

    el@apollo:/home/el/foo$ python main.py
    hi
    

    函数moobar从mylib.py中导入,并在main.py中可用。

例子3:使用from ... import ...功能:

  1. 把这个放在 /home/el/foo3/chekov.py 里:

    def question():
      print "where are the nuclear wessels?"
    
  2. 把这个放在 /home/el/foo3/main.py 里:

    from chekov import question
    question()
    
  3. 这样运行:

    el@apollo:/home/el/foo3$ python main.py 
    where are the nuclear wessels?
    

    如果你在chekov.py中定义了其他函数,除非你使用 import *,否则它们是不可用的。

例子4:如果导入的文件在不同的文件位置,导入riaa.py:

  1. 把这个放在 /home/el/foo4/stuff/riaa.py 里:

    def watchout():
      print "computers are transforming into a noose and a yoke for humans"
    
  2. 把这个放在 /home/el/foo4/main.py 里:

    import sys 
    import os
    sys.path.append(os.path.abspath("/home/el/foo4/stuff"))
    from riaa import *
    watchout()
    
  3. 运行它:

    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文件:

  1. 创建一个新目录 /home/el/foo5/
  2. 创建一个新目录 /home/el/foo5/herp
  3. 在herp下创建一个空文件,命名为 __init__.py

    el@apollo:/home/el/foo5/herp$ touch __init__.py
    el@apollo:/home/el/foo5/herp$ ls
    __init__.py
    
  4. 在herp下创建一个新目录 /home/el/foo5/herp/derp

  5. 在derp下,再创建一个 __init__.py 文件:

    el@apollo:/home/el/foo5/herp/derp$ touch __init__.py
    el@apollo:/home/el/foo5/herp/derp$ ls
    __init__.py
    
  6. 在 /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!!"
    
  7. 关键时刻,创建一个新文件 /home/el/foo5/main.py,把这个放进去:

    from herp.derp.yolo import skycake
    skycake()
    
  8. 运行它:

    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

552

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__) 可以获取更多详细信息。

撰写回答