如何导入其他 Python 文件?

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

  1. 一个文件(例如file.py)
  2. 文件夹
  3. 运行时基于用户输入的动态文件
  4. 文件的一个特定部分(例如单个函数)

答案 1

有很多方法可以导入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 *

示例 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!

如果你在这里收到一个错误:那么这意味着你正在使用python3,默认情况下,startuphooks在那里被禁用。ModuleNotFoundError: No module named 'user'

这个jist的功劳在于: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!!
    

    空文件向 python 解释器传达开发人员希望此目录成为可导入的包。__init__.py

如果你想看到我关于如何将所有.py文件包含在一个目录下的帖子,请参阅此处:https://stackoverflow.com/a/20753073/445131


答案 2

importlib 被添加到 Python 3 中,以编程方式导入模块。

import importlib

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

应从 中删除.py扩展名。该函数还定义了相对导入的参数。moduleNamepackage

在 python 2.x 中:

  • 只是没有.py扩展import file
  • 通过添加空文件,可以将文件夹标记为包__init__.py
  • 您可以使用该函数,它将模块名称(不带扩展名)作为字符串扩展名__import__
pmName = input('Enter module name:')
pm = __import__(pmName)
print(dir(pm))

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