【问题标题】:Importing files in Python?在 Python 中导入文件?
【发布时间】:2013-03-18 20:42:54
【问题描述】:

如何在执行过程中导入 Python 文件?

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

文件包含如下代码:

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 都是我在示例文件夹中创建的。

如何在 Python 中导入 python 文件?

【问题讨论】:

  • 如果所有文件都具有相同的路径,那么它就可以了
  • 你能在 ImportError 发生之前打印sys.path 吗?
  • 当我打印 sys.path 我得到: ['C:\\Users\\qksr\\Desktop\\Samples', 'C:\\Python27\\Lib\\idlelib', ' C:\\Windows\\system32\\python27.zip', 'C:\\Python27\\DLLs', 'C:\\Python27\\lib', 'C:\\Python27\\lib\\plat-赢', 'C:\\Python27\\lib\\lib-tk', 'C:\\Python27', 'C:\\Python27\\lib\\site-packages', 'C:\\Python27\ \lib\\site-packages\\win32', 'C:\\Python27\\lib\\site-packages\\win32\\lib', 'C:\\Python27\\lib\\site-packages\\ Pythonwin', 'C:\\Users\\qksr\\Desktop']
  • @User 我们可以看到正在附加路径,但我仍然面临那个特殊问题。
  • 如果您打开命令窗口 cd 到该目录,启动 python.exe 并在提示符中键入 import a 会发生什么?

标签: python file import


【解决方案1】:

如果你在同一个目录下工作,即b.pya.py在同一个文件夹下,我无法重现这个问题(也不知道为什么会出现这个问题),但它会是如果您发布 os.getcwd()b.py 返回的内容,将会很有帮助。

如果不是这样,请将其添加到 b.py 之上

import sys
sys.path.append('PATH TO a.py')

或者如果它们在同一路径中,

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

【讨论】:

  • @Schoolboy C:\Users\qksr\Desktop\Samples 这是我在执行 os.getcwd() 时得到的结果
  • 正如我所说,我无法在我的系统(Windows 7)上重现此问题。我做了同样的事情(在桌面上创建了一个文件夹Samples,并将 3 个文件放在那里),但什么也没出现。(除了 0 1 1 2):) 尝试我建议的解决方案。此外,当使用 Python 时,需要时使用模块(除非你有充分的理由不这样做)。
【解决方案2】:

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

选项 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 中可用

选项 3,使用 from ... import ... 功能:

  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,如果 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...
    

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

选项 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 解释器通信,开发人员希望此目录成为可导入的包。

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

额外提示,无论您使用的是 Mac、Linux 还是 Windows,都需要使用python's idle editor,如此处所述。它将解锁您的蟒蛇世界。 http://www.youtube.com/watch?v=DkW5CSZ_VII

【讨论】:

    【解决方案3】:

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

    更好的方法是通过添加一个名为__init__.py 的文件来使当前目录表现得像一个模块,该文件可以为空。

    然后python解释器允许你从那个目录导入文件。

    【讨论】:

      【解决方案4】:

      参考:我想知道如何导入在默认路径之外的任何路径中创建的文件?

      import sys
      
      sys.path.append(directory_path) # a.py should be located here
      

      【讨论】:

      • 如果所有文件都在同一个文件夹中,那么不需要添加任何路径,它应该可以正常工作。
      • @用户:你的意思是说在b.py中我需要添加import sys和sys.path.append('C:\Users\qksr\Desktop\Samples')。文件 a.py 、 b.py、c.py 位于该路径中的位置。
      • 试试看。可悲的是,我无法提及您遇到的错误,而只能提及您提出的问题。我不知道,为什么会出现错误。
      • @sharafjaffri 所有文件都在同一个文件夹中。该文件夹位于桌面。
      • @User 我尝试了你所说的同样的事情,但它抛出了同样的错误。
      【解决方案5】:

      默认情况下,Python 不会从当前工作目录导入模块。有 2 个(也许更多)解决方案:

      PYTHONPATH=. python my_file.py
      

      告诉python在.中寻找要导入的模块,或者:

      sys.path.append(os.path.dirname(__file__))
      

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

      【讨论】:

      • 是的,glglgl 是对的,见here
      • 啊,看来你是对的,对不起,我的经验因经常从更高的目录调用模块内的脚本而受到影响,该目录与“包含用于调用 Python 的脚本的目录”有关口译员”。
      【解决方案6】:

      第一个选项:将文件的路径添加到 Pythons 查看的默认路径中。

      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')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多