如何在Python中导入其他文件?
import file.py
这样的特定python文件?例如,在main.py
我有:
from extra import *
虽然这给了我extra.py
中的所有定义,但也许我想要的只是一个单一的定义:
def gap():
print
print
我怎么加入import
声明才能从gap
获得extra.py
?
importlib
是Python中最近添加的以编程方式导入模块的。它只是__import__
的包装请参阅https://docs.python.org/3/library/importlib.html#module-importlib
import importlib
moduleName = input('Enter module name:')
importlib.import_module(moduleName)
更新:以下答案已过时。使用上面更新的替代方案。
import file
。__init__.py
的空文件将文件夹标记为包。__import__
函数。它将模块名称作为字符串。 (再次:模块名称没有'.py'扩展名。)
pmName = input('Enter module name:')
pm = __import__(pmName)
print(dir(pm))
输入help(__import__)
了解更多详情。第一种情况:你想在文件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
。
只是在另一个python文件中导入python文件
假设我有helper.py python文件,它具有显示功能,如,
A.py
现在在app.py中,您可以使用显示功能,
import package_name.module_name
输出,
注意:无需指定.py扩展名。
这可能听起来很疯狂,但如果您只是为它创建一个包装器脚本,则可以创建一个指向要导入的文件的符号链接。
你也可以这样做:def display():
print("I'm working sundar gsv")
示例:import helper
helper.display()
请注意,您不需要I'm working sundar gsv
扩展名。
如果要导入的模块不在子目录中,请尝试以下操作并从最深的公共父目录运行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。
有很多方法,如上所列,但我发现我只想导入文件的内容,并且不想编写行和行,并且必须导入其他模块。所以,我提出了一种方法来获取文件的内容,即使使用点语法(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
这就是我从python文件中调用函数的方法,这对我调用任何函数都很灵活。
A string literal to import and test with
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
不要只是匆匆选择适合您的第一个导入策略,否则当您发现它不符合您的需求时,您将不得不重写代码库。
我将开始解释最简单的示例#1,然后我将转向最专业和最强大的示例#7
示例1,使用python解释器导入python模块:
def what_does_the_fox_say():
print("vixens cry")
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文件:
def moobar():
print("hi")
execfile("/home/el/foo2/mylib.py")
moobar()
el@apollo:/home/el/foo$ python main.py
hi
函数moobar是从mylib.py导入的,并在main.py中可用示例3,使用from ... import ...功能:
def question():
print "where are the nuclear wessels?"
from chekov import question
question()
el@apollo:/home/el/foo3$ python main.py
where are the nuclear wessels?
如果您在chekov.py中定义了其他函数,除非您使用import *
,否则它们将无法使用示例4,如果riaa.py位于与导入位置不同的文件位置,请将其导入
def watchout():
print "computers are transforming into a noose and a yoke for humans"
import sys
import os
sys.path.append(os.path.abspath("/home/el/foo4/stuff"))
from riaa import *
watchout()
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中导入文件:
/home/el/foo5/
/home/el/foo5/herp
的空文件:
__init__.py
el@apollo:/home/el/foo5/herp$ touch __init__.py
el@apollo:/home/el/foo5/herp$ ls
__init__.py
文件:
__init__.py
el@apollo:/home/el/foo5/herp/derp$ touch __init__.py
el@apollo:/home/el/foo5/herp/derp$ ls
__init__.py
的新文件放在那里:
yolo.py
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()
要使用已知名称在'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
您没有很多复杂的方法可以将python文件从一个文件夹导入另一个文件夹。只需创建一个__init__.py文件来声明这个文件夹是一个python包,然后转到你要导入的主机文件中
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
__init__.py
和
__all__
以下是我现在理解的两种简单方法,并确保您要作为库导入的“file.py”文件仅存在于当前目录中。
导入.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包的一个很好的解释。
我如何导入是导入文件并使用它的名称的简写。
__init__.py
不要忘记您的导入文件必须以.py扩展名命名
我想在其他地方加上这个说明我不太清楚;在模块/包中,从文件加载时,模块/包名必须以post为前缀。想象一下__init__.py
是这样的布局:
import DoStuff.py as DS
DS.main()
从mymodule
加载mymodule
/ /main.py
/mymodule
/__init__.py
/somefile.py
/otherstuff.py
时,内容应如下所示:
somefile.py