如何在执行期间导入Python文件?
我在路径a.py
b.py
,c.py
和C:\Users\qksr\Desktop\Samples
文件包含如下所示的代码:
a.py
from c import MyGlobals
def func2():
print MyGlobals.x
MyGlobals.x = 2
b.py
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
class MyGlobals(object):
x = 0
当我执行代码b.py时,会抛出以下错误:
ImportError: No module named a
我相信我的工作目录是默认的,所有文件a,b,c都是我在samples文件夹中创建的。
如何在Python中导入python文件?
答案 0 :(得分:6)
如果您在同一目录中工作,即b.py
与a.py
位于同一文件夹中,我无法重现此问题(并且不知道为什么会出现此问题),但如果您发布os.getcwd()
的{{1}}次返回信息会很有帮助。
如果不是这种情况,请在b.py
b.py
或者如果它们在同一条路径中,
import sys
sys.path.append('PATH TO a.py')
答案 1 :(得分:5)
调整PYTHONPATH
通常不是一个好主意。
更好的方法是通过添加名为__init__.py
的文件使当前目录的行为类似于模块,该文件可以为空。
然后python解释器允许您从该目录导入文件。
答案 2 :(得分:5)
不要只是匆匆选择适合您的第一个导入策略,否则当您发现它不符合您的需求时,您将不得不重写代码库。
我开始解释最简单的控制台示例#1,然后转向最专业,最强大的程序示例#5
示例1,使用python解释器导入python模块:
将它放在/home/el/foo/fox.py中:
def what_does_the_fox_say():
print "vixens cry"
进入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解释器从文件what_does_the_fox_say()
中调用了python函数fox
。
选项2,在脚本中使用execfile来执行其他python文件:
将其放入/home/el/foo2/mylib.py:
def moobar():
print "hi"
将其放入/home/el/foo2/main.py:
execfile("/home/el/foo2/mylib.py")
moobar()
运行文件:
el@apollo:/home/el/foo$ python main.py
hi
函数moobar是从mylib.py导入的,并在main.py中可用
选项3,使用...导入...功能:
将其放入/home/el/foo3/chekov.py:
def question():
print "where are the nuclear wessels?"
将其放入/home/el/foo3/main.py:
from chekov import question
question()
像这样运行:
el@apollo:/home/el/foo3$ python main.py
where are the nuclear wessels?
如果您在chekov.py中定义了其他功能,除非import *
选项4,如果riaa.py位于与导入位置不同的文件位置,则导入riaa.py
把它放在/home/el/foo4/bittorrent/riaa.py中:
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:
import sys
import os
sys.path.append(os.path.abspath("/home/el/foo4/bittorrent"))
from riaa import *
watchout_for_riaa_mpaa()
运行它:
el@apollo:/home/el/foo4$ python main.py
there are honeypot kesha songs on bittorrent...
从其他目录导入外来文件中的所有内容。
选项5,使用裸导入命令在python中导入文件:
/home/el/foo5/
/home/el/foo5/herp
在herp下创建一个名为__init__.py
的空文件:
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.py
的新文件放在那里:
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解释器通信,开发人员打算将此目录作为可导入的包。
如果您想查看有关如何在目录下包含所有.py文件的帖子,请参阅此处:https://stackoverflow.com/a/20753073/445131
Bonus protip,无论您使用的是Mac,Linux还是Windows,都需要使用此处所述的python's idle editor。它将解锁你的python世界。 http://www.youtube.com/watch?v=DkW5CSZ_VII
答案 3 :(得分:1)
参考:我想知道如何导入在默认路径之外的任何路径中创建的文件?
import sys
sys.path.append(directory_path) # a.py should be located here
答案 4 :(得分:0)
默认情况下,Python不会从当前工作目录导入模块。有两种(可能更多)解决方案:
PYTHONPATH=. python my_file.py
告诉python在.
中查找要导入的模块,或者:
sys.path.append(os.path.dirname(__file__))
修改运行时的导入路径,添加“当前”文件的目录。
答案 5 :(得分:0)
第一个选项: 将文件的路径添加到Python查找的默认路径。
import sys
sys.path.insert(0, 'C:/complete/path/to/my/directory')
第二个选项: ,使用以下内容添加相对于您当前环境根目录(当前目录)的路径:
#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')