如何导入其他 Python 文件?

2024-11-25 08:50:00
admin
原创
169
摘要:问题描述:如何在 Python 中导入文件?我想要导入:一个文件(例如file.py)一个文件夹根据用户输入在运行时动态地创建文件文件的一个特定部分(例如单个函数)解决方案 1:导入 Python 文件的方法有很多种,各有优缺点。不要匆忙选择适合您的第一个导入策略,否则当您发现它不能满足您的需求时,您将不得不...

问题描述:

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

  1. 一个文件(例如file.py

  2. 一个文件夹

  3. 根据用户输入在运行时动态地创建文件

  4. 文件的一个特定部分(例如单个函数)


解决方案 1:

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

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

我将首先解释最简单的示例 #1,然后再介绍最专业、最可靠的示例 #7

例1,用python解释器导入一个python模块:

  1. 将其放入/home/el/foo/fox.py:

def what_does_the_fox_say():
  print("vixens cry")
  1. 进入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")
  1. 将其放入/home/el/foo2/main.py:

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

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?")
  1. 将其放入/home/el/foo3/main.py:

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

el@apollo:/home/el/foo3$ python main.py 
where 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")
  1. 将其放入/home/el/foo4/main.py:

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

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 是被禁用的。

此要点归功于: https: //github.com/docwhat/homedir-examples/blob/master/python-commandline/.pythonrc.py 请发送您的 up-boats。

示例 7,最强大:使用裸导入命令在 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
  1. 创建新目录 /home/el/foo5/herp/derp

  2. 在 derp 下,创建另一个__init__.py文件:

el@apollo:/home/el/foo5/herp/derp$ touch __init__.py
el@apollo:/home/el/foo5/herp/derp$ ls
__init__.py
  1. 在 /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!!")
  1. 关键时刻,创建新文件/home/el/foo5/main.py,并将其放入其中;

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

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

解决方案 2:

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__)以了解更多详细信息。

解决方案 3:

第一种情况

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

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

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

import A

或者

from A import *

或者

from A import THINGS_YOU_WANT_TO_IMPORT_IN_A

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


第二种情况

你想folder/A.py在文件中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

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


概括

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

  • 第二种情况下,folder是包含模块的包A.py,您使用了语法import package_name.module_name

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

解决方案 4:

要在“运行时”导入具有已知名称的特定 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

解决方案 5:

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

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

解决方案 6:

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

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

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

mydir/spam/__init__.py
mydir/spam/module.py
import spam.module
or
from spam import module

解决方案 7:

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”文件仅存在于当前目录中。

解决方案 8:

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

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

在导入函数的文件中写入以下内容:

from x import greet

如果您不想导入文件中的所有功能,这将很有用。

解决方案 9:

使用 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")

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

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 one
one.py was imported as __main__
two.py was imported as two
file.py was imported as mymod

这个答案基于官方 Python 文档::importlib直接导入源文件。

解决方案 10:

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

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

首先附加路径然后导入

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

解决方案 11:

我想补充一下我在其他地方不太清楚的一点:在模块/包中,从文件加载时,模块/包名称必须以 为前缀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

解决方案 12:

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

Mike Grouchy 的这篇文章很好地解释了__init__.py如何制作、导入和设置 Python 包。

解决方案 13:

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

import DoStuff.py as DS
DS.main()

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

解决方案 14:

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

  1. 例如如果你的文件名为 abc.py (import abc),限制是你的文件应该与调用的 python 脚本位于同一位置。

导入 abc

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

从文件夹导入 abc

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

从文件夹.internal_folder 导入 abc

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

导入操作系统

导入系统

脚本路径 = “../Test/MyModule.py”

sys.path.append(os.path.abspath(scriptpath))

导入MyModule

如果您的 Python 脚本已更新而您不想上传 - 请使用以下语句进行自动刷新。奖励 :)

%load_ext autoreload 
%autoreload 2

解决方案 15:

这帮助我使用Visual Studio Code构建我的 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++ →首选项:打开设置ShiftJSON)P

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

"python.terminal.executeInFileDir": true

对于其他系统来说,这个问题也提供了更全面的答案。

解决方案 16:

如果您要导入的模块不在子目录中,请尝试以下操作并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()

可选(如果您加载例如配置)(对于我的用例来说,Inspect 似乎是最强大的)

# 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 中都有效。

解决方案 17:

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

解决方案 18:

只需将 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 扩展名。

解决方案 19:

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

解决方案 20:

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

解决方案 21:

您还可以执行以下操作:from filename import something

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

解决方案 22:

有很多方法,如上所列,但我发现我只想导入文件的内容,而不想写一行又一行的代码,也不想导入其他模块。所以,我想到了一种获取文件内容的方法,甚至使用点语法 ( 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

解决方案 23:

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

  • 您想将 y 文件导入到 x。

然后转到 x 文件并输入上述命令。要测试这一点,只需在 y 文件中放入打印函数,导入成功后,x 文件中就会打印该函数。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用