用Python导入文件?

时间:2013-03-28 12:06:05

标签: python file import

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

我在路径a.py

中创建了3个文件b.pyc.pyC:\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文件?

6 个答案:

答案 0 :(得分:6)

如果您在同一目录中工作,即b.pya.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)

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

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

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

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

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

    def what_does_the_fox_say():
      print "vixens cry"
    
  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
    >>> 
    

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

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

    1. 将其放入/home/el/foo2/mylib.py:

      def moobar():
        print "hi"
      
    2. 将其放入/home/el/foo2/main.py:

      execfile("/home/el/foo2/mylib.py")
      moobar()
      
    3. 运行文件:

      el@apollo:/home/el/foo$ python main.py
      hi
      

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

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

      1. 将其放入/home/el/foo3/chekov.py:

        def question():
          print "where are the nuclear wessels?"
        
      2. 将其放入/home/el/foo3/main.py:

        from chekov import question
        question()
        
      3. 像这样运行:

        el@apollo:/home/el/foo3$ python main.py 
        where are the nuclear wessels?
        

        如果您在chekov.py中定义了其他功能,除非import *

      4. ,否则它们将无法使用

        选项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."
          
        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()
          
        3. 运行它:

          el@apollo:/home/el/foo4$ python main.py 
          there are honeypot kesha songs on bittorrent...
          

          从其他目录导入外来文件中的所有内容。

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

          1. 制作新目录/home/el/foo5/
          2. 制作新目录/home/el/foo5/herp
          3. 在herp下创建一个名为__init__.py的空文件:

            el@apollo:/home/el/foo5/herp$ touch __init__.py
            el@apollo:/home/el/foo5/herp$ ls
            __init__.py
            
          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
            
          6. 在/ 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!!"
            
          7. 真实的时刻,制作新文件/home/el/foo5/main.py,将其放在那里;

            from herp.derp.yolo import skycake
            skycake()
            
          8. 运行它:

            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解释器通信,开发人员打算将此目录作为可导入的包。

          9. 如果您想查看有关如何在目录下包含所有.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')