1042

如何在 Python 中导入其他文件?

  1. 我怎样才能导入特定的 python 文件import file.py
  2. 如何导入文件夹而不是特定文件?
  3. 我想根据用户输入在运行时动态加载 Python 文件。
  4. 我想知道如何从文件中加载一个特定的部分。

例如,在main.py我有:

from extra import * 

虽然这给了我所有的定义extra.py,但也许我想要的只是一个定义:

def gap():
    print
    print

我要在import语句中添加什么以从中gap获取extra.py

4

23 回答 23

1262

导入 python 文件的方法有很多种,各有优缺点。

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

我将开始解释最简单的示例#1,然后我将转向最专业和最强大的示例#7

示例 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
    >>> 
    

    what_does_the_fox_say()您通过 python 解释器导入了 fox,从 fox.py 中调用了 python 函数。

示例 2,在脚本中使用execfile或(exec在 Python 3中)来执行其他 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/stuff/riaa.py 中:

    def watchout():
      print "computers are transforming into a noose and a yoke for humans"
    
  2. 把它放在 /home/el/foo4/main.py 中:

    import sys 
    import os
    sys.path.append(os.path.abspath("/home/el/foo4/stuff"))
    from riaa import *
    watchout()
    
  3. 运行:

    el@apollo:/home/el/foo4$ python main.py 
    computers are transforming into a noose and a yoke for humans
    

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

示例5,使用os.system("python yourfile.py")

import os
os.system("python yourfile.py")

示例 6,通过搭载 python startuphook 导入文件:

更新:这个例子曾经适用于 python2 和 3,但现在只适用于 python2。python3 摆脱了这个用户启动钩子特性集,因为它被低技能的 python 库编写者滥用,在所有用户定义的程序之前使用它来不礼貌地将他们的代码注入全局命名空间。如果你想让它适用于 python3,你将不得不变得更有创意。如果我告诉你怎么做,python 开发人员也会禁用该功能集,所以你只能靠自己了。

请参阅:https ://docs.python.org/2/library/user.html

将此代码放入您的主目录~/.pythonrc.py

class secretclass:
    def secretmessage(cls, myarg):
        return myarg + " is if.. up in the sky, the sky"
    secretmessage = classmethod( secretmessage )

    def skycake(cls):
        return "cookie and sky pie people can't go up and "
    skycake = classmethod( skycake )

将此代码放入您的 main.py 中(可以在任何地方):

import user
msg = "The only way skycake tates good" 
msg = user.secretclass.secretmessage(msg)
msg += user.secretclass.skycake()
print(msg + " have the sky pie! SKYCAKE!")

运行它,你应该得到这个:

$ python main.py
The only way skycake tates good is if.. up in the sky, 
the skycookie and sky pie people can't go up and  have the sky pie! 
SKYCAKE!

如果你在这里得到一个错误:ModuleNotFoundError: No module named 'user'那么这意味着你正在使用 python3,startuphooks 在默认情况下是禁用的。

这个 jist 的功劳归功于:https ://github.com/docwhat/homedir-examples/blob/master/python-commandline/.pythonrc.py 沿着你的船发送。

示例 7,最强大:使用裸导入命令在 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

于 2013-12-23T18:46:10.163 回答
517

importlib被添加到 Python 3 以编程方式导入模块。

import importlib

moduleName = input('Enter module name:')
importlib.import_module(moduleName)

.py 扩展名应该从moduleName. 该函数还package为相对导入定义了一个参数。

在 python 2.x 中:

  • 只是import file没有 .py 扩展名
  • 一个文件夹可以被标记为一个包,通过添加一个空__init__.py文件
  • 您可以使用该__import__函数,它将模块名称(不带扩展名)作为字符串扩展名
pmName = input('Enter module name:')
pm = __import__(pmName)
print(dir(pm))

键入help(__import__)以获取更多详细信息。

于 2010-02-28T03:42:33.213 回答
89

要在“运行时”导入具有已知名称的特定 Python 文件:

import os
import sys

...

scriptpath = "../Test/"

# Add the directory containing your module to the Python path (wants absolute paths)
sys.path.append(os.path.abspath(scriptpath))

# Do the import
import MyModule
于 2013-04-30T12:30:38.733 回答
84

第一种情况

您要A.py在 file 中导入文件B.py,这两个文件在同一个文件夹中,如下所示:

. 
├── A.py 
└── B.py

您可以在文件中执行此操作B.py

import A

或者

from A import *

或者

from A import THINGS_YOU_WANT_TO_IMPORT_IN_A

然后你就可以使用file A.pyin file的所有功能了B.py


第二种情况

您要folder/A.py在 file 中导入文件B.py,这两个文件不在同一个文件夹中,如下所示:

.
├── B.py
└── folder
     └── A.py

您可以在文件中执行此操作B.py

import folder.A

或者

from folder.A import *

或者

from folder.A import THINGS_YOU_WANT_TO_IMPORT_IN_A

然后你就可以使用file A.pyin file的所有功能了B.py


概括

  • 在第一种情况下,文件A.py是您在文件中导入的模块B.py,您使用了语法import module_name
  • 第二种情况下folder是包含模块的包A.py,您使用的语法import package_name.module_name

有关包和模块的更多信息,请参阅此链接

于 2019-05-15T13:57:32.717 回答
36

您没有很多复杂的方法可以将 python 文件从一个文件夹导入到另一个文件夹。只需创建一个__init__.py文件来声明此文件夹是一个 python 包,然后转到您要导入的主机文件,只需键入

from root.parent.folder.file import variable, class, whatever

于 2013-01-24T14:08:54.513 回答
24

导入文档 .. -- 参考链接

需要这些__init__.py文件才能使 Python 将目录视为包含包,这样做是为了防止具有通用名称(例如字符串)的目录无意中隐藏模块搜索路径中稍后出现的有效模块。

__init__.py可以只是一个空文件,但它也可以执行包的初始化代码或设置__all__变量。

mydir/spam/__init__.py
mydir/spam/module.py
import spam.module
or
from spam import module
于 2015-10-02T08:27:54.797 回答
19
from file import function_name  ######## Importing specific function
function_name()                 ######## Calling function

import file              ######## Importing whole package
file.function1_name()    ######## Calling function
file.function2_name()    ######## Calling function

这是我现在理解的两种简单方法,并确保要作为库导入的“file.py”文件仅存在于当前目录中。

于 2018-02-09T18:49:15.480 回答
17

如果定义的函数在文件中x.py

def greet():
    print('Hello! How are you?')

在要导入函数的文件中,写下:

from x import greet

如果您不想导入文件中的所有函数,这很有用。

于 2019-08-17T12:11:56.807 回答
6

我如何导入是导入文件并使用它的名称的简写。

import DoStuff.py as DS
DS.main()

不要忘记您的导入文件必须以 .py 扩展名命名

于 2016-05-09T09:01:49.647 回答
6

导入 .py 文件的最佳方式是通过__init__.py. __init__.py最简单的做法是在 your.py 文件所在的同一目录中创建一个名为的空文件。

Mike Grouchy 的这篇文章__init__.py很好地解释了它在制作、导入和设置 python 包方面的用途。

于 2017-06-27T15:43:12.853 回答
6

我想在别处添加我不太清楚的注释;在模块/包中,从文件加载时,模块/包名称必须以mymodule. 想象一下mymodule这样的布局:

/main.py
/mymodule
    /__init__.py
    /somefile.py
    /otherstuff.py

从内容加载somefile.py/时应如下所示:otherstuff.py__init__.py

from mymodule.somefile import somefunc
from mymodule.otherstuff import otherfunc
于 2018-04-18T09:51:57.297 回答
6
import sys
#print(sys.path)
sys.path.append('../input/tokenization')
import tokenization

要导入任何 .py 文件,您可以使用上述代码。

先追加路径,然后导入

注意:'../input/tokenization'目录包含tokenization.py文件

于 2021-07-01T18:13:33.547 回答
5

使用 Python 3.5 或更高版本,您可以importlib.util直接将.py任意位置的文件作为模块导入,而无需修改sys.path.

import importlib.util
import sys

def load_module(file_name, module_name)
    spec = importlib.util.spec_from_file_location(module_name, file_name)
    module = importlib.util.module_from_spec(spec)
    sys.modules[module_name] = module
    spec.loader.exec_module(module)
    return module

file_name参数必须是字符串或类似路径的对象。该module_name参数是必需的,因为所有加载的 Python 模块都必须有一个(带点的)模块名称(如sysimportlibimportlib.util),但您可以为这个新模块选择任何可用的名称。

你可以像这样使用这个函数:

my_module = load_module("file.py", "mymod")

在使用该load_module()函数将其导入 Python 进程一次后,该模块将可以使用为其指定的模块名称导入。

# file.py =
print(f"{__name__} imported (file.py)")
# =========

# one.py ==
print(f"{__name__} imported (one.py)")
load_module("file.py", "mymod")
import two
# =========

# two.py ==
print(f"{__name__} imported (two.py)")
import mymod
# =========

鉴于上述文件,您可以运行以下命令来查看如何file.py变得可导入。

$ python3 -m one
__main__ imported (one.py)
two imported (two.py)
mymod imported (file.py)

此答案基于官方 Python 文档:importlib: Importing a source file directly。

于 2021-04-22T06:51:15.127 回答
4

有几种方法可以包含名称为 abc.py 的 python 脚本

  1. 例如,如果您的文件被称为 abc.py (import abc) 限制是您的文件应该出现在您的调用 python 脚本所在的同一位置。

导入 abc

  1. 例如,如果您的 python 文件位于 Windows 文件夹中。Windows 文件夹位于调用 python 脚本的同一位置。

从文件夹导入 abc

  1. Incase abc.py 脚本在文件夹内部的 internal_folder 中可用

从文件夹.internal_folder 导入 abc

  1. 正如上面詹姆斯所回答的那样,如果您的文件位于某个固定位置

导入 os
导入 sys
scriptpath = "../Test/MyModule.py"
sys.path.append(os.path.abspath(scriptpath))
导入 MyModule

如果您的 python 脚本得到更新并且您不想上传 - 使用这些语句进行自动刷新。奖金 :)

%load_ext autoreload 
%autoreload 2
于 2019-07-29T14:13:16.400 回答
3

如果您要导入的模块不在子目录中,请尝试以下操作并app.py从最深的公共父目录运行:

目录结构:

/path/to/common_dir/module/file.py
/path/to/common_dir/application/app.py
/path/to/common_dir/application/subpath/config.json

app.py中,将客户端的路径附加到 sys.path:

import os, sys, inspect

sys.path.append(os.getcwd())
from module.file import MyClass
instance = MyClass()

可选(如果您加载例如配置)(检查似乎是我的用例中最强大的)

# Get dirname from inspect module
filename = inspect.getframeinfo(inspect.currentframe()).filename
dirname = os.path.dirname(os.path.abspath(filename))
MY_CONFIG = os.path.join(dirname, "subpath/config.json")

user@host:/path/to/common_dir$ python3 application/app.py

该解决方案在 cli 和 PyCharm 中都适用于我。

于 2018-12-04T14:10:41.193 回答
3

这就是我从 python 文件中调用函数的方式,这对我来说可以灵活地调用任何函数。

import os, importlib, sys

def callfunc(myfile, myfunc, *args):
    pathname, filename = os.path.split(myfile)
    sys.path.append(os.path.abspath(pathname))
    modname = os.path.splitext(filename)[0]
    mymod = importlib.import_module(modname)
    result = getattr(mymod, myfunc)(*args)
    return result

result = callfunc("pathto/myfile.py", "myfunc", arg1, arg2)
于 2019-04-28T16:34:49.433 回答
2

只是将python文件导入另一个python文件

假设我有helper.py python 文件,它具有显示功能,例如,

def display():
    print("I'm working sundar gsv")

现在在app.py中,你可以使用显示功能,

import helper
helper.display()

输出,

I'm working sundar gsv

注意:无需指定 .py 扩展名。

于 2018-03-25T13:27:38.547 回答
1

你也可以这样做:from filename import something

示例:from client import Client 请注意,您不需要.py .pyw .pyui扩展名。

于 2018-06-30T13:22:40.800 回答
1

这听起来可能很疯狂,但如果您只是为其创建一个包装脚本,则可以创建一个指向要导入的文件的符号链接。

于 2018-07-29T02:20:57.477 回答
1

Python 的一个非常未知的功能是导入zip文件的能力:

library.zip
|-library
|--__init__.py

包的文件__init__.py包含以下内容:

def dummy():
    print 'Testing things out...'

我们可以编写另一个脚本,它可以从 zip 存档中导入一个包。只需将 zip 文件添加到 sys.path。

import sys
sys.path.append(r'library.zip')

import library

def run():
    library.dummy()

run()
于 2019-05-09T08:04:13.147 回答
0

方法有很多,如上所列,但我发现我只想导入一个文件的内容,不想写一行行又非要导入其他模块。因此,我想出了一种获取文件内容的方法,即使使用点语法 ( file.property) 而不是将导入的文件与您的文件合并。
首先,这是我要导入的文件,data.py

    testString= "A string literal to import and test with"


注意:您可以改用.txt扩展名。
mainfile.py中,首先打开并获取内容。

    #!usr/bin/env python3
    Data=open('data.txt','r+').read()

现在您将内容作为字符串,但尝试访问data.testString会导致错误,就像类data的实例一样str,即使它确实具有属性testString,它也不会按照您的预期进行。
接下来,创建一个类。例如(双关语),ImportedFile

    class ImportedFile:

并将其放入其中(带有适当的缩进):

    exec(data)


最后,像这样重新分配data

    data=ImportedFile()

就是这样!就像访问任何其他模块一样,输入print(data.testString)将打印到控制台A string literal to import and test with
但是,如果您想要from mod import *仅删除类、实例分配和删除exec.

希望这会有所帮助:)
-Benji

于 2018-08-21T18:57:19.653 回答
0
from y import * 
  • 假设您有一个文件 x 和 y。
  • 您想将 y 文件导入 x。

然后转到您的 x 文件并放置上述命令。要测试这一点,只需在您的 y 文件中放置一个打印功能,当您的导入成功时,它应该在 x 文件中打印它。

于 2021-01-31T11:28:07.560 回答
0

这帮助我用 vscode 构建了我的 python 项目。

当您不在__init__.py目录内声明时,可能会导致问题。目录变为implicit namespace package.Here is a nice summary about python imports and project structure link

此外,如果您想将运行按钮顶部栏中的 vscode 运行按钮与不在主包内的脚本一起使用,您可以尝试从实际目录运行控制台。

例如,您test_game_item.py要从测试包中打开并在omission(主包)目录中打开 vscode:

├── omission
│   ├── app.py
│   ├── common
│   │   ├── classproperty.py
│   │   ├── constants.py
│   │   ├── game_enums.py
│   │   └── __init__.py
│   ├── game
│   │   ├── content_loader.py
│   │   ├── game_item.py
│   │   ├── game_round.py
│   │   ├── __init__.py
│   │   └── timer.py
│   ├── __init__.py
│   ├── __main__.py
│   ├── resources
│   └── tests
│       ├── __init__.py
│       ├── test_game_item.py
│       ├── test_game_round_settings.py
│       ├── test_scoreboard.py
│       ├── test_settings.py
│       ├── test_test.py
│       └── test_timer.py
├── pylintrc
├── README.md
└── .gitignore

[ 1 ]中的目录结构

您可以尝试设置:

(windows) ctrl+shift+p -> Preferences: Open Settings (JSON).

将此行添加到您的用户设置

"python.terminal.executeInFileDir": true

其他系统的更全面的答案也在这个线程链接中。

于 2022-02-26T16:52:28.227 回答