如何导入其他Python文件?

如何在Python中导入文件?我要导入:

  1. 文件(例如file.py
  2. 一个文件夹
  3. 基于用户输入在运行时动态生成的文件
  4. 文件的一个特定部分(例如单个函数)
2512960 次浏览

#0被添加到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__)以获取更多详细信息。

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

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

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

import osimport 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 importimport MyModule

导入python文件的方法有很多,都有其优点和缺点。

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

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

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

  1. 把这个放在 /home/el/foo/fox.py:

    def what_does_the_fox_say():print("vixens cry")
  2. Get into the python interpreter:

    el@apollo:/home/el/foo$ pythonPython 2.7.3 (default, Sep 26 2013, 20:03:06)>>> import fox>>> fox.what_does_the_fox_say()vixens cry>>>

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

示例2,在脚本中使用execfile或(Python 3中的exec)来执行其他python文件:

  1. 把这个放在 /home/el/foo2/mylib.py:

    def moobar():print("hi")
  2. Put this in /home/el/foo2/main.py:

    execfile("/home/el/foo2/mylib.py")moobar()
  3. run the file:

    el@apollo:/home/el/foo$ python main.pyhi

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

示例3,使用from…导入…功能:

  1. 把这个放在 /home/el/foo3/chekov.py:

    def question():print "where are the nuclear wessels?"
  2. Put this in /home/el/foo3/main.py:

    from chekov import questionquestion()
  3. Run it like this:

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

    如果您在chekov.py中定义了其他函数,它们将不可用,除非您import *

示例4,导入riaa.py如果它位于与导入位置不同的文件位置

  1. 把这个放在 /home/el/foo4/stuff/riaa.py:

    def watchout():print "computers are transforming into a noose and a yoke for humans"
  2. Put this in /home/el/foo4/main.py:

    import sysimport ossys.path.append(os.path.abspath("/home/el/foo4/stuff"))from riaa import *watchout()
  3. Run it:

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

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

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

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

示例6,通过携带python startuphook导入您的文件:

更新时间:这个例子曾经适用于python2和3,但现在只适用于python2。python3摆脱了这个用户startuphook功能集,因为它被低技能的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 usermsg = "The only way skycake tates good"msg = user.secretclass.secretmessage(msg)msg += user.secretclass.skycake()print(msg + " have the sky pie! SKYCAKE!")

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

$ python main.pyThe 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. 在herp下创建一个名为__init__.py的空文件:

    el@apollo:/home/el/foo5/herp$ touch __init__.pyel@apollo:/home/el/foo5/herp$ ls__init__.py
  4. Make a new directory /home/el/foo5/herp/derp

  5. Under derp, make another __init__.py file:

    el@apollo:/home/el/foo5/herp/derp$ touch __init__.pyel@apollo:/home/el/foo5/herp/derp$ ls__init__.py
  6. Under /home/el/foo5/herp/derp make a new file called yolo.py Put this in there:

    def skycake():print "SkyCake evolves to stay just beyond the cognitive reach of " +"the bulk of men. SKYCAKE!!"
  7. The moment of truth, Make the new file /home/el/foo5/main.py, put this in there;

    from herp.derp.yolo import skycakeskycake()
  8. Run it:

    el@apollo:/home/el/foo5$ python main.pySkyCake evolves to stay just beyond the cognitive reach of the bulkof men. SKYCAKE!!

    空的__init__.py文件传达给python解释器,开发人员打算将此目录作为可导入的包。

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

导入文档…--链接供参考

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

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

mydir/spam/__init__.pymydir/spam/module.pyimport spam.moduleorfrom spam import module

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

import DoStuff.py as DSDS.main()

别忘了您的导入文件一定是以. py扩展名命名

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

Mike Grouchy的这篇帖子很好地解释了__init__.py及其用于制作、导入和设置python包的用途。

from file import function_name  ######## Importing specific functionfunction_name()                 ######## Calling function

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

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

只是为了在另一个python文件中导入python文件

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

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

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

import helperhelper.display()

的输出,

I'm working sundar gsv

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

我想添加这个注意事项,我在其他地方不太清楚;在模块/包内,从文件加载时,模块/包名称必须以mymodule为前缀。想象mymodule是这样的布局:

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

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

from mymodule.somefile import somefuncfrom mymodule.otherstuff import otherfunc

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

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

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

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

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


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

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

现在你有一个字符串的内容,但是尝试访问data.testString会导致一个错误,因为datastr类的一个实例,即使它有一个属性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

如果要导入的模块不在子目录中,请尝试以下操作并从最深的公共父目录运行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 MyClassinstance = MyClass()

可选(如果您加载配置)(检查似乎是我用例中最健壮的一个)

# Get dirname from inspect modulefilename = inspect.getframeinfo(inspect.currentframe()).filenamedirname = 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。

这就是我从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)

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

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

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

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

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

import syssys.path.append(r'library.zip')
import library
def run():library.dummy()
run()

第一例

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

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

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

import A

from A import *

from A import THINGS_YOU_WANT_TO_IMPORT_IN_A

然后您将能够在文件B.py中使用文件A.py的所有功能


第二例

您想在文件B.py中导入文件folder/A.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

然后您将能够在文件B.py中使用文件A.py的所有功能


总结

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

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

有几种方法可以将您的python脚本与名称abc.py

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

导入abc

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

从文件夹导入abc

  1. Incaseabc.py脚本是可用的内部internal_folder这是目前在文件夹内

从folder.internal_folder导入abc

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

导入os
导入sys


/Test/MyModule.pysys.path.append(os.path.abspath脚本路径)
代码库

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

%load_ext autoreload%autoreload 2

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

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

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

from x import greet

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

from y import *
  • 假设您有一个文件x和y。
  • 您想将y文件导入x。

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

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

import importlib.utilimport 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] = modulespec.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"file.py was imported as {__name__}")

one.py

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

two.py

print(f"two.py was imported as {__name__})")import mymod

给定上面的文件,您可以运行以下命令来查看file.py是如何变得可导入的。

$ python3 -m oneone.py was imported as __main__two.py was imported as twofile.py was imported as mymod

这个答案基于官方的Python留档:#0:直接导入源文件。

import sys#print(sys.path)sys.path.append('../input/tokenization')import tokenization

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

先追加path再导入

注意:'…/输入/令牌化'目录包含tokenization.py文件

这帮助我用Visual Studio代码构建了我的Python项目。

当您没有在目录中声明__init__.py时,可能会导致问题。目录变成了implicit namespace package。这是关于Python导入和项目结构的一个很好的总结。

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

例如,您想从测试包中执行打开的test_game_item.py,并且您在omission(主包)目录中打开了Visual Studio Code:

├── 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

目录结构来自[2]。

您可以尝试设置:

(Windows)Ctrl+Shift+P首选项:打开设置(JSON)

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

"python.terminal.executeInFileDir": true

对于其他系统,更全面的答案是这个问题