用Python导入文件?

Importing files in Python?

如何在执行期间导入python文件?

我在C:\Users\qksr\Desktop\Samples的路径中创建了3个文件a.pyb.pyc.py

这些文件包含如下所示的代码:

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文件?


如果你在同一个目录下工作,也就是说,b.pya.py在同一个文件夹中,我无法重现这个问题(也不知道为什么会出现这个问题),但如果你公布b.pyos.getcwd()返回结果,这会很有帮助。

如果不是这样的话,在b.py上加上这个

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解释器从文件fox中调用了python函数what_does_the_fox_say()

  • 选项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中定义了其他函数,它们将不可用,除非您import *

  • 选项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中导入文件:

  • 新建目录/home/el/foo5/
  • 新建目录/home/el/foo5/herp
  • 在herp下生成一个名为__init__.py的空文件:

    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下,再制作一份__init__.py文件:

    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下,创建一个名为yolo.py的新文件,将此文件放入其中:

    1
    2
    3
    def skycake():
      print"SkyCake evolves to stay just beyond the cognitive reach of" +
     "the bulk of men. SKYCAKE!!"

  • 实事求是的时候,把新文件/home/el/foo5/main.py放进去;

    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!!

    空的__init__.py文件与python解释器通信,开发人员希望这个目录是一个可导入的包。

  • 如果您想查看我关于如何在目录下包含所有.py文件的文章,请参见:https://stackoverflow.com/a/20753073/445131

    额外的Protip,无论您使用的是Mac、Linux还是Windows,您都需要使用这里描述的Python的空闲编辑器。它将开启你的Python世界。http://www.youtube.com/watch?V=dkw5csz_七


    调整PYTHONPATH通常不是一个好主意。

    一个更好的方法是通过添加一个名为__init__.py的文件,使当前目录的行为类似于一个模块,该文件可以是空的。

    然后,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__))

    在运行时修改导入路径,添加"当前"文件的目录。