如何在Python中导入其他文件?
python
import file.py
例如,在main.py我有:
main.py
from extra import *
尽管这给了我中的所有定义extra.py,但也许我只想要一个定义:
extra.py
def gap(): print print
我要从import语句中添加些什么?gapextra.py
gapextra.py
importlib是Python中的新增功能,用于以编程方式导入模块。它只是一个包装器,__import__请参见https://docs.python.org/3/library/importlib.html#module-importlib
importlib
__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'扩展名。
import file
'.py'
您可以通过添加一个名为的空文件来将文件夹标记为包__init__.py。
__init__.py
您可以使用该__import__功能。它以模块名称作为字符串。(同样:模块名称不带“ .py”扩展名。)
pmName = input('Enter module name:') pm = __import__(pmName) print(dir(pm))
输入help(__import__)以获取更多详细信息。
help(__import__)
导入python文件的方法有很多,各有利弊。 不要只是匆忙地选择适合您的第一个导入策略,否则稍后您将在发现不符合您的需求时重写代码库。
我将首先说明最简单的示例#1,然后将介绍最专业,最可靠的示例#7
示例1,使用python解释器导入python模块:
def what_does_the_fox_say(): print("vixens cry")
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文件:
def moobar(): print("hi")
execfile("/home/el/foo2/mylib.py") moobar()
el@apollo:/home/el/foo$ python main.py hi
功能moobar是从mylib.py导入的,并在main.py中可用
示例3,从…使用…导入…功能:
def question(): print "where are the nuclear wessels?"
from chekov import question question()
el@apollo:/home/el/foo3$ python main.py where are the nuclear wessels?
如果您在chekov.py中定义了其他函数,那么除非您使用它们,否则它们将不可用 import *
示例4,如果导入的riaa.py与导入的文件位于不同的位置,请导入
def watchout(): print "computers are transforming into a noose and a yoke for humans"
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,通过piggy带python startuphook导入文件:
更新:此示例曾经同时适用于python2和3,但现在仅适用于python2。python3摆脱了此用户启动钩子功能集,因为它被低技能的python库编写者滥用,使用它在所有用户定义的程序之前不礼貌地将其代码注入到全局名称空间中。如果您希望此功能适用于python3,则必须变得更有创意。如果我告诉您如何做,python开发人员也会禁用该功能集,因此您是一个人。
参见:https : //docs.python.org/2/library/user.html
将此代码放入您的主目录中 ~/.pythonrc.py
~/.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,默认情况下会禁用启动钩。
ModuleNotFoundError: No module named 'user'
值得一提的是:https : //github.com/docwhat/homedir-examples/blob/master/python-commandline/.pythonrc.py随便 发送。
示例7,最健壮:使用裸导入命令在python中导入文件:
/home/el/foo5/
/home/el/foo5/herp
el@apollo:/home/el/foo5/herp$ touch __init__.py el@apollo:/home/el/foo5/herp$ ls __init__.py
新建一个目录/ 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.pyPut this
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解释器开发人员打算将此目录作为可导入包。