用Python导入文件?

Kau*_*hik 6 python import file

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

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

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

a.py

from c import MyGlobals

def func2():
    print MyGlobals.x
    MyGlobals.x = 2
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

c.py

class MyGlobals(object):
    x = 0
Run Code Online (Sandbox Code Playgroud)

当我执行代码b.py时,抛出以下错误:

ImportError: No module named a
Run Code Online (Sandbox Code Playgroud)

我相信我的工作目录是默认的,所有文件a,b,c都是我在samples文件夹中创建的.

如何在Python中导入python文件?

pra*_*nsg 6

如果你在同一个目录中工作,也就是说,b.py在同一个文件夹中a.py,我无法重现这个问题(并且不知道为什么会出现这个问题),但是如果你发布了os.getcwd()返回的内容会有所帮助b.py.

如果不是这种情况,请在此基础上添加 b.py

import sys
sys.path.append('PATH TO a.py')
Run Code Online (Sandbox Code Playgroud)

或者,如果他们在同一条道路上,

import sys
sys.path.append(os.basename(sys.argv[0])) # It should be there anyway but still..
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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

然后python解释器允许您从该目录导入文件.


Eri*_*ski 5

导入python文件的方法有很多种:

不要只是匆匆选择适合您的第一个导入策略,否则当您发现它不符合您的需求时,您将不得不重写代码库.

我开始解释最简单的控制台示例#1,然后转向最专业和最强大的程序示例#5

示例1,使用python解释器导入python模块:

  1. 把它放在/home/el/foo/fox.py中:

    def what_does_the_fox_say():
      print "vixens cry"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 进入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
    >>> 
    
    Run Code Online (Sandbox Code Playgroud)

    您通过python解释器what_does_the_fox_say()从文件中调用了python函数fox.

选项2,在脚本中使用execfile来执行其他python文件:

  1. 把它放在/home/el/foo2/mylib.py中:

    def moobar():
      print "hi"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 把它放在/home/el/foo2/main.py中:

    execfile("/home/el/foo2/mylib.py")
    moobar()
    
    Run Code Online (Sandbox Code Playgroud)
  3. 运行文件:

    el@apollo:/home/el/foo$ python main.py
    hi
    
    Run Code Online (Sandbox Code Playgroud)

    函数moobar是从mylib.py导入的,并在main.py中可用

选项3,使用...导入...功能:

  1. 把它放在/home/el/foo3/chekov.py中:

    def question():
      print "where are the nuclear wessels?"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 把它放在/home/el/foo3/main.py中:

    from chekov import question
    question()
    
    Run Code Online (Sandbox Code Playgroud)
  3. 像这样运行:

    el@apollo:/home/el/foo3$ python main.py 
    where are the nuclear wessels?
    
    Run Code Online (Sandbox Code Playgroud)

    如果您在chekov.py中定义了其他函数,除非您这样做,否则它们将无法使用 import *

选项4,如果riaa.py位于与导入位置不同的文件位置,则导入riaa.py

  1. 把它放在/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."
    
    Run Code Online (Sandbox Code Playgroud)
  2. 把它放在/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()
    
    Run Code Online (Sandbox Code Playgroud)
  3. 运行:

    el@apollo:/home/el/foo4$ python main.py 
    there are honeypot kesha songs on bittorrent...
    
    Run Code Online (Sandbox Code Playgroud)

    从不同的目录导入外部文件中的所有内容.

选项5,使用裸导入命令在python中导入文件:

  1. 创建一个新目录 /home/el/foo5/
  2. 创建一个新目录 /home/el/foo5/herp
  3. 创建一个以__init__.pyherp 命名的空文件:

    el@apollo:/home/el/foo5/herp$ touch __init__.py
    el@apollo:/home/el/foo5/herp$ ls
    __init__.py
    
    Run Code Online (Sandbox Code Playgroud)
  4. 创建一个新目录/ home/el/foo5/herp/derp

  5. 在derp下,制作另一个__init__.py文件:

    el@apollo:/home/el/foo5/herp/derp$ touch __init__.py
    el@apollo:/home/el/foo5/herp/derp$ ls
    __init__.py
    
    Run Code Online (Sandbox Code Playgroud)
  6. 在/ 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!!"
    
    Run Code Online (Sandbox Code Playgroud)
  7. 真实的时刻,制作新文件/home/el/foo5/main.py,把它放在那里;

    from herp.derp.yolo import skycake
    skycake()
    
    Run Code Online (Sandbox Code Playgroud)
  8. 运行:

    el@apollo:/home/el/foo5$ python main.py
    SkyCake evolves to stay just beyond the cognitive reach of the bulk 
    of men. SKYCAKE!!
    
    Run Code Online (Sandbox Code Playgroud)

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

如果您想查看有关如何在目录下包含所有.py文件的帖子,请参阅此处:https://stackoverflow.com/a/20753073/445131

Bonus protip,无论您使用的是Mac,Linux还是Windows,都需要使用python的空闲编辑器,如此处所述.它将解锁你的python世界. http://www.youtube.com/watch?v=DkW5CSZ_VII