6

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

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

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

一个.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

py

class MyGlobals(object):
    x = 0

当我执行代码 b.py 时,会引发以下错误:

ImportError: No module named a

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

如何在 Python 中导入 python 文件?

4

6 回答 6

6

如果您在同一目录中工作,即与b.py位于同一文件夹中a.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..
于 2013-03-28T12:17:36.597 回答
6

有很多方法可以导入 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

选项 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 位于与导入位置不同的文件位置,则导入

  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. __init__.py创建一个名为herp的空文件:

    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.pyPut this in there 的新文件:

    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 的空闲编辑器,如此处所述。它将解锁您的蟒蛇世界。 http://www.youtube.com/watch?v=DkW5CSZ_VII

于 2014-01-12T15:05:19.880 回答
5

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

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

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

于 2013-03-28T12:18:28.847 回答
1

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

import sys

sys.path.append(directory_path) # a.py should be located here
于 2013-03-28T12:09:33.197 回答
0

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

PYTHONPATH=. python my_file.py

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

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

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

于 2013-03-28T12:14:44.503 回答
0

第一个选项:将文件的路径添加到 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')
于 2018-12-30T03:38:15.983 回答