协慌网

登录 贡献 社区

如何导入其他 Python 文件?

如何在 Python 中导入其他文件?

  1. 我究竟该如何导入特定的 python 文件(例如import file.py
  2. 如何导入文件夹而不是特定文件?
  3. 我想根据用户输入在运行时动态加载 Python 文件。
  4. 我想知道如何从文件中仅加载一个特定部分。

例如,在main.py我有:

from extra import *

尽管这为我提供了extra.py所有定义,但是也许我想要的只是一个定义:

def gap():
    print
    print

我怎么添加到import语句先手gapextra.py

答案

导入 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 中调用了 python 函数what_does_the_fox_say()

示例 2,在脚本中使用execfile或( Python 3中的exec )在适当的位置执行另一个 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,从... 使用... 导入... 功能:

  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 *否则它们将不可用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,通过 piggy 带 python startuphook 导入文件:

更新:此示例曾经同时适用于 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'错误: 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. 新建一个目录 / 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

importlib是 Python 中的新增功能,用于以编程方式导入模块。它只是__import__的包装器,请参见https://docs.python.org/3/library/importlib.html#module-importlib

import importlib

moduleName = input('Enter module name:')
importlib.import_module(moduleName)

更新:以下答案已过时 。使用上面的最新替代方法。

  1. 只需import file不带 '.py' 扩展名的文件。

  2. 您可以通过添加一个名为__init__.py的空文件来将文件夹标记为包。

  3. 您可以使用__import__函数。它以模块名称作为字符串。 (同样:模块名称不带 “.py” 扩展名。)

    pmName = input('Enter module name:')
    pm = __import__(pmName)
    print(dir(pm))

    键入help(__import__)以获得更多详细信息。

要在 “运行时” 以已知名称导入特定的 Python 文件:

import os
import sys

...

scriptpath = "../Test/"

# Add the directory containing your module to the Python path (wants absolute paths)
sys.path.append(os.path.abspath(scriptpath))

# Do the import
import MyModule