如何导入其他Python文件?

问题描述 投票:627回答:17

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

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

例如,在main.py我有:

from extra import * 

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

def gap():
    print
    print

我怎么加入import声明才能从gap获得extra.py

python python-import
17个回答
364
投票

importlib是Python中最近添加的以编程方式导入模块的。它只是__import__的包装请参阅https://docs.python.org/3/library/importlib.html#module-importlib

import importlib

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

更新:以下答案已过时。使用上面更新的替代方案。

  1. 只是没有'.py'扩展名的import file
  2. 您可以通过添加名为__init__.py的空文件将文件夹标记为包。
  3. 您可以使用__import__函数。它将模块名称作为字符串。 (再次:模块名称没有'.py'扩展名。) pmName = input('Enter module name:') pm = __import__(pmName) print(dir(pm)) 输入help(__import__)了解更多详情。

3
投票

第一种情况:你想在文件otherstuff.py中导入文件__init__.py,这两个文件在同一个文件夹中,如下所示:

from mymodule.somefile import somefunc
from mymodule.otherstuff import otherfunc

你可以在文件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

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

folder/A.py

要么

B.py

要么

.
├── B.py
└── folder
     └── A.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


1
投票

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

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

A.py

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

import package_name.module_name

输出,

link

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


1
投票

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


1
投票

你也可以这样做:def display(): print("I'm working sundar gsv")

示例:import helper helper.display() 请注意,您不需要I'm working sundar gsv扩展名。


1
投票

如果要导入的模块不在子目录中,请尝试以下操作并从最深的公共父目录运行from filename import something

目录结构:

from client import Client

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

app.py

可选(如果你加载例如配置)(Inspect似乎是我用例中最强大的一个)

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

app.py

这个解决方案适用于cli和PyCharm。


0
投票

有很多方法,如上所列,但我发现我只想导入文件的内容,并且不想编写行和行,并且必须导入其他模块。所以,我提出了一种方法来获取文件的内容,即使使用点语法(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

注意:您可以使用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)无效。

希望这可以帮助:) -Benji


-1
投票

这就是我从python文件中调用函数的方法,这对我调用任何函数都很灵活。

A string literal to import and test with

-1
投票

Python的一个非常未知的功能是导入from mod import *文件的能力:

exec

包的文件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) 包含以下内容:

zip

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

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

856
投票

有许多方法可以导入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 >>> 你通过python解释器导入了fox,从fox.py中调用了python函数what_does_the_fox_say()

示例2,在脚本中使用execfile或(exec in 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位于与导入位置不同的文件位置,请将其导入

  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摆脱了这个用户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 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。

这要归功于:qazxsw poi沿着你的船只发送。

示例7,最强大:使用裸导入命令在python中导入文件:

  1. 创建一个新目录https://github.com/docwhat/homedir-examples/blob/master/python-commandline/.pythonrc.py
  2. 创建一个新目录/home/el/foo5/
  3. 在herp下创建一个名为/home/el/foo5/herp的空文件: __init__.py
  4. 创建一个新目录/ home / el / foo5 / herp / derp
  5. 在derp下,制作另一个el@apollo:/home/el/foo5/herp$ touch __init__.py el@apollo:/home/el/foo5/herp$ ls __init__.py 文件: __init__.py
  6. 在/ home / el / foo5 / herp / derp下创建一个名为el@apollo:/home/el/foo5/herp/derp$ touch __init__.py el@apollo:/home/el/foo5/herp/derp$ ls __init__.py 的新文件放在那里: yolo.py
  7. 真相的那一刻,制作新文件qazxsw poi,把它放在他们的; qazxsw poi
  8. 运行: def skycake(): print "SkyCake evolves to stay just beyond the cognitive reach of " + "the bulk of men. SKYCAKE!!" 空的/home/el/foo5/main.py文件与python解释器通信,开发人员希望此目录是可导入的包。

如果你想查看关于如何在目录下包含所有.py文件的帖子,请参阅:from herp.derp.yolo import skycake skycake()


51
投票

要使用已知名称在'runtime'导入特定的Python文件:

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

26
投票

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

https://stackoverflow.com/a/20753073/445131


17
投票

import os import sys - 链接供参考

需要使用scriptpath = "../Test/MyModule.py" # 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 文件来使Python将目录视为包含包,这样做是为了防止具有通用名称的目录(例如字符串)无意中隐藏稍后在模块搜索路径上发生的有效模块。

from root.parent.folder.file import variable, class, whatever可以只是一个空文件,但它也可以执行包的初始化代码或设置Import doc ..变量。

__init__.py

11
投票
__init__.py

__all__

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


5
投票

导入.py文件的最佳方法是通过mydir/spam/__init__.py mydir/spam/module.py import spam.module or from spam import module 。最简单的方法是在your.py文件所在的同一目录中创建一个名为from file import function_name ######## Importing specific function function_name() ######## Calling function 的空文件。

这个由Mike Grouchy撰写的import file ######## Importing whole package file.function1_name() ######## Calling function file.function2_name() ######## Calling function 是对__init__.py及其用于制作,导入和设置python包的一个很好的解释。


4
投票

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

__init__.py

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


4
投票

我想在其他地方加上这个说明我不太清楚;在模块/包中,从文件加载时,模块/包名必须以post为前缀。想象一下__init__.py是这样的布局:

import DoStuff.py as DS
DS.main()

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

somefile.py
© www.soinside.com 2019 - 2024. All rights reserved.