Importing files in Python?
如何在执行期间导入python文件?
我在
这些文件包含如下所示的代码:
A.Py
1 2 3 4 5 | from c import MyGlobals def func2(): print MyGlobals.x MyGlobals.x = 2 |
B.Py
1 2 3 4 5 6 7 8 9 10 11 12 | import a from c import MyGlobals def func1(): MyGlobals.x = 1 if __name__ =="__main__": print MyGlobals.x func1() print MyGlobals.x a.func2() print MyGlobals.x |
号
C.Py
1 2 | class MyGlobals(object): x = 0 |
当我执行代码b.py时,会引发以下错误:
1 | ImportError: No module named a |
。
我相信我的工作目录是默认的,所有文件a,b,c都是我在samples文件夹中创建的。
如何在python中导入python文件?
如果你在同一个目录下工作,也就是说,
如果不是这样的话,在
1 2 | import sys sys.path.append('PATH TO a.py') |
。
或者如果他们在同一条路上,
1 2 | import sys sys.path.append(os.basename(sys.argv[0])) # It should be there anyway but still.. |
有很多方法可以导入python文件:
不要草率地选择第一个适合您的导入策略,否则稍后当您发现代码库不符合您的需求时,您将不得不重写代码库。
我首先解释最简单的控制台示例1,然后转向最专业和最健壮的程序示例5。
示例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解释器从文件
选项2,在脚本中使用execfile就地执行另一个python文件:
把这个放在/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/bittorrent/riaa.py中:
1 2 3 4 5 | def watchout_for_riaa_mpaa(): print"there are honeypot kesha songs on bittorrent that log IP" + "addresses of seeders and leechers. Then comcast records strikes against" + "that user and thus, the free internet was transmogified into" + "a pay-per-view cable-tv enslavement device back in the 20th century." |
号
把它放在/home/el/foo4/main.py中:
1 2 3 4 5 6 | import sys import os sys.path.append(os.path.abspath("/home/el/foo4/bittorrent")) from riaa import * watchout_for_riaa_mpaa() |
号
运行它:
1 2 | el@apollo:/home/el/foo4$ python main.py there are honeypot kesha songs on bittorrent... |
号
从另一个目录导入外部文件中的所有内容。
选项5,使用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
额外的Protip,无论您使用的是Mac、Linux还是Windows,您都需要使用这里描述的Python的空闲编辑器。它将开启你的Python世界。http://www.youtube.com/watch?V=dkw5csz_七
调整
一个更好的方法是通过添加一个名为
然后,python解释器允许您从该目录导入文件。
参考:我想知道如何导入在默认路径之外的任何路径中创建的文件?
1 2 3 | import sys sys.path.append(directory_path) # a.py should be located here |
第一个选项:将文件路径添加到pythons看到的默认路径。
1 2 | import sys sys.path.insert(0, 'C:/complete/path/to/my/directory') |
。
第二个选项:添加相对于环境当前根目录(当前目录)的路径,而使用以下选项:
1 2 3 4 5 6 7 8 9 10 | #Learn your current root import os os.getcwd() #Change your current root (optional) os.chdir('C:/new/root') #Add the path from your current root '.' to your directory import sys sys.path.insert(0, './Path/from/current/root/to/my/directory') |
号
默认情况下,python不会从当前工作目录导入模块。有两种(可能更多)解决方案:
1 | PYTHONPATH=. python my_file.py |
号
它告诉python在
1 | sys.path.append(os.path.dirname(__file__)) |
在运行时修改导入路径,添加"当前"文件的目录。