How to import other Python files?
如何在python中导入其他文件?
例如,在
1 | from extra import * |
虽然这给了我
1 2 3 | def gap(): |
我应该在
导入python文件有很多方法,都有其优点和缺点。
不要草率地选择第一个适合您的导入策略,否则稍后当您发现代码库不符合您的需求时,您将不得不重写代码库。
我先解释最简单的例子1,然后转向最专业和最强大的例子7。
示例1,使用python解释器导入python模块:
把这个放在/home/el/foo/fox.py中:
1 2 | def what_does_the_fox_say(): print("vixens cry") |
进入python解释器:
1 2 3 4 5 6 | 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函数
示例2,在脚本中使用
把这个放在/home/el/foo2/mylib.py中:
1 2 | def moobar(): print("hi") |
把这个放在/home/el/foo2/main.py中:
1 2 | execfile("/home/el/foo2/mylib.py") moobar() |
运行文件:
1 2 | el@apollo:/home/el/foo$ python main.py hi |
moobar函数是从mylib.py导入的,并在main.py中可用。
示例3,使用自…导入…功能:
把这个放在/home/el/foo3/chekov.py中:
1 2 | def question(): print"where are the nuclear wessels?" |
把它放在/home/el/foo3/main.py中:
1 2 | from chekov import question question() |
像这样运行:
1 2 | el@apollo:/home/el/foo3$ python main.py where are the nuclear wessels? |
如果您在chekov.py中定义了其他函数,那么它们将不可用,除非您
示例4,如果riaa.py与导入的文件位置不同,则导入它
把这个放在/home/el/foo4/stufacture/riaa.py中:
1 2 | def watchout(): print"computers are transforming into a noose and a yoke for humans" |
把这个放在/home/el/foo4/main.py中:
1 2 3 4 5 | import sys import os sys.path.append(os.path.abspath("/home/el/foo4/stuff")) from riaa import * watchout() |
运行它:
1 2 | el@apollo:/home/el/foo4$ python main.py computers are transforming into a noose and a yoke for humans |
从另一个目录导入外部文件中的所有内容。
例5,使用
1 2 | import os os.system("python yourfile.py") |
示例6,通过piggybacking the python startuphook导入文件:
参见:https://docs.python.org/3/library/user.html
将此代码放入您在
1 2 3 4 5 6 7 8 | 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(可以是任何位置):
1 2 3 4 5 | 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!") |
运行它:
1 2 3 4 | $ 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! |
这个jist的功劳是:https://github.com/docwhat/homedir examples/blob/master/python commandline/.pythonrc.py沿着你的小船发送。
示例7,最健壮的:使用bare import命令在python中导入文件:
在herp下生成一个名为
1 2 3 | el@apollo:/home/el/foo5/herp$ touch __init__.py el@apollo:/home/el/foo5/herp$ ls __init__.py |
创建新目录/home/el/foo5/herp/derp
在DERP下,再制作一份
1 2 3 | 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下,创建一个名为
1 2 3 | def skycake(): print"SkyCake evolves to stay just beyond the cognitive reach of" + "the bulk of men. SKYCAKE!!" |
在真相时刻,把新文件
1 2 | from herp.derp.yolo import skycake skycake() |
运行它:
1 2 3 | el@apollo:/home/el/foo5$ python main.py SkyCake evolves to stay just beyond the cognitive reach of the bulk of men. SKYCAKE!! |
空的
如果您想查看我关于如何在目录下包含所有.py文件的文章,请参阅:https://stackoverflow.com/a/20753073/445131
奖金提示
无论您使用的是Mac、Linux还是Windows,您都需要使用这里描述的Python的空闲编辑器。它将开启你的Python世界。http://www.youtube.com/watch?V= DKW5CSZVII VII
1 2 3 4 | import importlib moduleName = input('Enter module name:') importlib.import_module(moduleName) |
更新:下面的答案已过时。使用上面较新的选项。
只有
通过添加名为
您可以使用
1 2 3 | pmName = input('Enter module name:') pm = __import__(pmName) print(dir(pm)) |
键入
要在"运行时"导入具有已知名称的特定python文件,请执行以下操作:
1 2 | import os import sys |
…
1 2 3 4 5 6 7 | scriptpath ="../Test/MyModule.py" # 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 |
您没有很多复杂的方法可以将python文件从一个文件夹导入到另一个文件夹。只需创建一个uu init_uuu.py文件来声明这个文件夹是一个python包,然后转到您想要导入的主机文件,只需键入
导入文档--供参考的链接
为了使python将目录视为包含包,需要使用
1 2 3 4 5 | mydir/spam/__init__.py mydir/spam/module.py import spam.module or from spam import module |
1 2 | from file import function_name ######## Importing specific function function_name() ######## Calling function |
和
1 2 3 | import file ######## Importing whole package file.function1_name() ######## Calling function file.function2_name() ######## Calling function |
下面是我现在理解的两种简单方法,并确保您要作为库导入的"file.py"文件只存在于当前目录中。
导入.py文件的最佳方法是通过
Mike Grouchy的这篇文章是对
如何导入是导入文件并使用其名称的简写。
1 2 | import DoStuff.py as DS DS.main() |
不要忘记导入文件必须以.py扩展名命名。
我想在其他地方添加一个我不太清楚的注释;在模块/包中,从文件加载时,模块/包名称必须以
1 2 3 4 5 | /main.py /mymodule /__init__.py /somefile.py /otherstuff.py |
从
1 2 | from mymodule.somefile import somefunc from mymodule.otherstuff import otherfunc |
如果要导入的模块不在子目录中,请尝试以下操作并从最深的公共父目录运行
目录结构:
1 2 3 | /path/to/common_dir/module/file.py /path/to/common_dir/application/app.py /path/to/common_dir/application/subpath/config.json |
在
1 2 3 4 5 | import os, sys, inspect sys.path.append(os.getcwd()) from module.file import MyClass instance = MyClass() |
可选(如果您加载配置等)(对于我的用例,inspect似乎是最健壮的一个)
1 2 3 4 | # Get dirname from inspect module filename = inspect.getframeinfo(inspect.currentframe()).filename dirname = os.path.dirname(os.path.abspath(filename)) MY_CONFIG = os.path.join(dirname,"subpath/config.json") |
跑
1 | user@host:/path/to/common_dir$ python3 application/app.py |
这个解决方案在cli和pycharm中都适用。
有很多方法,如上所列,但我发现我只想导入文件的内容,不想写行和行,也不想导入其他模块。因此,我想出了一种方法来获取文件的内容,即使使用点语法(
1 | testString="A string literal to import and test with" |
注意:您可以使用
在
1 2 | #!usr/bin/env python3 Data=open('data.txt','r+').read() |
现在您将内容作为字符串,但是尝试访问
1 | class ImportedFile: |
把这个放进去(有适当的缩进):
1 | exec(data) |
最后,像这样重新分配
1 | data=ImportedFile() |
就这样!就像访问其他模块一样,键入
希望这有帮助:)
-本吉
这听起来可能很疯狂,但是如果您只是在创建一个包装脚本,那么您可以创建一个指向要导入文件的符号链接。
你也可以这样做:
示例:
只需将python文件导入另一个python文件
假设我有helper.py python文件,它具有如下显示功能:
1 2 | def display(): print("I'm working sundar gsv") |
现在在app.py中,您可以使用显示功能,
1 2 | import helper helper.display() |
输出,
注意:不需要指定.py扩展名。