一尘不染

如何导入其他Python文件?

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


阅读 600

收藏
2020-02-11

共2个答案

一尘不染

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

import importlib

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

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

只是import file没有'.py'扩展名。

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

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

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

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

2020-02-11
一尘不染

导入python文件的方法有很多,各有利弊。
不要只是匆忙地选择适合您的第一个导入策略,否则稍后您将在发现不符合您的需求时重写代码库。

我将首先说明最简单的示例#1,然后将介绍最专业,最可靠的示例#7

示例1,使用python解释器导入python模块:

  1. 将其放在/home/el/foo/fox.py中:
def what_does_the_fox_say():
  print("vixens cry")
  1. 进入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,并what_does_the_fox_say()从fox.py中调用了python函数。

示例2,在脚本中使用execfile或(exec在Python 3中)在适当的位置执行另一个python文件:

  1. 将其放在/home/el/foo2/mylib.py中:
def moobar():
  print("hi")
  1. 将其放在/home/el/foo2/main.py中:
execfile("/home/el/foo2/mylib.py")
moobar()
  1. 运行文件:
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?"
  1. 将其放在/home/el/foo3/main.py中:
from chekov import question
question()
  1. 像这样运行它:
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"
  1. 将其放在/home/el/foo4/main.py中:
import sys 
import os
sys.path.append(os.path.abspath("/home/el/foo4/stuff"))
from riaa import *
watchout()
  1. 运行:
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'这意味着您使用的是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. 制作一个__init__.py在herp下命名的空文件:
el@apollo:/home/el/foo5/herp$ touch __init__.py
el@apollo:/home/el/foo5/herp$ ls
__init__.py
  1. 新建一个目录/ home / el / foo5 / herp / derp

  2. 在derp下,制作另一个__init__.py文件:

el@apollo:/home/el/foo5/herp/derp$ touch __init__.py
el@apollo:/home/el/foo5/herp/derp$ ls
__init__.py
  1. / home / el / foo5 / herp / derp下,创建一个名为yolo.pyPut this 的新文件:
def skycake():
  print "SkyCake evolves to stay just beyond the cognitive reach of " +
  "the bulk of men. SKYCAKE!!"
  1. 关键时刻,创建新文件/home/el/foo5/main.py,并将其放入其中;
from herp.derp.yolo import skycake
skycake()
  1. 运行:

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解释器开发人员打算将此目录作为可导入包。

2020-02-11