如何导入其他 Python 文件?
如何在 Python 中导入文件?我想导入:
- 一个文件(例如
file.py
) - 一个文件夹
- 一个文件 在运行时根据用户输入动态地
- 导入 文件的一个特定部分(例如单个函数)
How do I import files in Python? I want to import:
- a file (e.g.
file.py
) - a folder
- a file dynamically at runtime, based on user input
- one specific part of a file (e.g. a single function)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(23)
导入 python 文件的方法有很多种,各有优缺点。
不要匆忙选择第一个适合您的导入策略,否则当您发现它不能满足您的需求时,您将不得不重写代码库。
我将首先解释最简单的示例 #1,然后我将转向最专业和最强大的示例 #7
示例 1,使用 python 解释器导入 python 模块:
将其放入/home/el/foo/fox.py:
进入 python 解释器:
您通过Python解释器导入了fox,并从fox.py中调用了python函数
what_does_the_fox_say()
。示例 2,在 Python 3 中使用
execfile
或 (exec
) 在脚本中执行其他 python 文件:将其放入 /home/el/foo2/mylib.py:
将其放入 /home/el/foo2/main.py:
运行文件:
函数 moobar 是从 mylib.py 导入的,并在 main.py 中可用
示例 3,使用 from ... import ... 功能:
将其放入 /home/ el/foo3/chekov.py:
将其放入 /home/el/foo3/main.py:
像这样运行:
如果您在 chekov.py 中定义了其他函数,除非您
import *
,否则它们将不可用如果您在 chekov.py 中定义了其他函数,除非您
import *
示例 4,导入 riaa.py(如果它位于不同的文件位置),否则 它已导入将其放入 /home/el/foo4/stuff/riaa.py:
将其放入 /home/el/foo4/main.py:
运行它:
从不同的目录导入外部文件中的所有内容。
示例 5,使用
os.system("python yourfile.py")
示例 6,通过搭载 python 启动钩子导入文件:
更新:此示例曾经适用于 python2 和 3,但现在仅适用于 python2。 python3 摆脱了这个用户startuphook 功能集,因为它被低技能的Python 库编写者滥用,使用它不礼貌地将代码注入到所有用户定义程序之前的全局命名空间中。如果您希望它适用于 python3,您必须发挥更多创意。如果我告诉你如何做,Python 开发人员也会禁用该功能集,所以你只能靠自己了。
请参阅:https://docs.python.org/2/library/user.html< /a>
将此代码放入
~/.pythonrc.py
中的主目录将此代码放入 main.py(可以在任何地方):
运行它,您应该得到以下结果:
如果您得到这里出现错误:
ModuleNotFoundError: No module named 'user'
那么这意味着您正在使用 python3,默认情况下启动钩子在那里被禁用。此要点的功劳在于: https:// github.com/docwhat/homedir-examples/blob/master/python-commandline/.pythonrc.py 发送你的上船。
示例 7,最强大:使用裸导入命令在 python 中导入文件:
创建一个新目录
/home/el/foo5/
创建一个新目录
/home/el/foo5/herp
在herp下创建一个名为
__init__.py
的空文件:创建一个新目录/home/el/foo5/herp/derp
在 derp 下,创建另一个
__init__.py
文件:在 /home/el/foo5/herp/derp 下创建一个名为
yolo.py
的新文件,将其放入其中:关键时刻,创建新文件
/home/el /foo5/main.py
,把它放在那里;运行它:
空的
__init__.py
文件向 python 解释器传达开发人员希望此目录成为可导入包的信息。如果您想查看我关于如何在目录下包含所有 .py 文件的帖子,请参阅此处:https://stackoverflow.com/a /20753073/445131
There are many ways to import a python file, all with their pros and cons.
Don't just hastily pick the first import strategy that works for you or else you'll have to rewrite the codebase later on when you find it doesn't meet your needs.
I'll start out explaining the easiest example #1, then I'll move toward the most professional and robust example #7
Example 1, Import a python module with python interpreter:
Put this in /home/el/foo/fox.py:
Get into the python interpreter:
You imported fox through the python interpreter, invoked the python function
what_does_the_fox_say()
from within fox.py.Example 2, Use
execfile
or (exec
in Python 3) in a script to execute the other python file in place:Put this in /home/el/foo2/mylib.py:
Put this in /home/el/foo2/main.py:
run the file:
The function moobar was imported from mylib.py and made available in main.py
Example 3, Use from ... import ... functionality:
Put this in /home/el/foo3/chekov.py:
Put this in /home/el/foo3/main.py:
Run it like this:
If you defined other functions in chekov.py, they would not be available unless you
import *
Example 4, Import riaa.py if it's in a different file location from where it is imported
Put this in /home/el/foo4/stuff/riaa.py:
Put this in /home/el/foo4/main.py:
Run it:
That imports everything in the foreign file from a different directory.
Example 5, use
os.system("python yourfile.py")
Example 6, import your file via piggybacking the python startuphook:
Update: This example used to work for both python2 and 3, but now only works for python2. python3 got rid of this user startuphook feature set because it was abused by low-skill python library writers, using it to impolitely inject their code into the global namespace, before all user-defined programs. If you want this to work for python3, you'll have to get more creative. If I tell you how to do it, python developers will disable that feature set as well, so you're on your own.
See: https://docs.python.org/2/library/user.html
Put this code into your home directory in
~/.pythonrc.py
Put this code into your main.py (can be anywhere):
Run it, you should get this:
If you get an error here:
ModuleNotFoundError: No module named 'user'
then it means you're using python3, startuphooks are disabled there by default.Credit for this jist goes to: https://github.com/docwhat/homedir-examples/blob/master/python-commandline/.pythonrc.py Send along your up-boats.
Example 7, Most Robust: Import files in python with the bare import command:
Make a new directory
/home/el/foo5/
Make a new directory
/home/el/foo5/herp
Make an empty file named
__init__.py
under herp:Make a new directory /home/el/foo5/herp/derp
Under derp, make another
__init__.py
file:Under /home/el/foo5/herp/derp make a new file called
yolo.py
Put this in there:The moment of truth, Make the new file
/home/el/foo5/main.py
, put this in there;Run it:
The empty
__init__.py
file communicates to the python interpreter that the developer intends this directory to be an importable package.If you want to see my post on how to include ALL .py files under a directory see here: https://stackoverflow.com/a/20753073/445131
importlib
已添加到 Python 3以编程方式导入模块。应从
moduleName
中删除 .py 扩展名。该函数还为相对导入定义了一个package
参数。在 python 2.x 中:
import file
而不带 .py 扩展名__init__.py
文件,可以将文件夹标记为包名键入
help(__import__)
了解更多详细信息。importlib
was added to Python 3 to programmatically import a module.The .py extension should be removed from
moduleName
. The function also defines apackage
argument for relative imports.In python 2.x:
import file
without the .py extension__init__.py
file__import__
function, which takes the module name (without extension) as a string extensionType
help(__import__)
for more details.第一种情况
您想要将文件
A.py
导入到文件B.py
中,这两个文件位于同一文件夹中,如下所示:您可以在文件
B 中执行此操作.py
:或者
或者
然后你就可以在
B.py>文件中使用
A.py
文件的所有功能第二案例
您想在文件
B.py
中导入文件folder/A.py
,这两个文件不在同一个文件夹中,如下所示:您可以在文件<中执行此操作code>B.py:
或者
或者
然后你就可以在
B.py
文件中使用A.py
文件的所有功能< strong>摘要
A.py
是您在文件B中导入的模块。 py
,您使用了语法import module_name
。folder
是包含模块A.py
的包,您使用了语法import package_name.module_name< /代码>。
有关包和模块的更多信息,请参阅此链接。
First case
You want to import file
A.py
in fileB.py
, these two files are in the same folder, like this:You can do this in file
B.py
:or
or
Then you will be able to use all the functions of file
A.py
in fileB.py
Second case
You want to import file
folder/A.py
in fileB.py
, these two files are not in the same folder, like this:You can do this in file
B.py
:or
or
Then you will be able to use all the functions of file
A.py
in fileB.py
Summary
A.py
is a module that you imports in fileB.py
, you used the syntaximport module_name
.folder
is the package that contains the moduleA.py
, you used the syntaximport package_name.module_name
.For more info on packages and modules, consult this link.
要在“运行时”导入已知名称的特定 Python 文件:
...
To import a specific Python file at 'runtime' with a known name:
...
将 python 文件从一个文件夹导入到另一个文件夹的复杂方法并不多。只需创建一个 __init__.py 文件来声明此文件夹是一个 python 包,然后转到要导入的主机文件,只需键入
from root.parent.folder.file import 变量,类,无论什么
You do not have many complex methods to import a python file from one folder to another. Just create a __init__.py file to declare this folder is a python package and then go to your host file where you want to import just type
from root.parent.folder.file import variable, class, whatever
导入文档.. -- 参考链接
__init__.py
文件是使 Python 将目录视为包含包所必需的,这样做是为了防止具有通用名称(例如字符串)的目录无意中隐藏稍后出现在模块搜索路径上的有效模块。__init__.py
可以只是一个空文件,但它也可以执行包的初始化代码或设置__all__
变量。Import doc .. -- Link for reference
The
__init__.py
files are required to make Python treat the directories as containing packages, this is done to prevent directories with a common name, such as string, from unintentionally hiding valid modules that occur later on the module search path.__init__.py
can just be an empty file, but it can also execute initialization code for the package or set the__all__
variable.这
是我现在已经理解的两种简单方法,并确保要作为库导入的“file.py”文件仅存在于当前目录中。
and
Here are the two simple ways I have understood by now and make sure your "file.py" file which you want to import as a library is present in your current directory only.
如果定义的函数位于文件
x.py
中:在要导入该函数的文件中,写入以下内容:
如果您不希望导入文件中的所有函数,这很有用。
If the function defined is in a file
x.py
:In the file where you are importing the function, write this:
This is useful if you do not wish to import all the functions in a file.
使用 Python 3.5 或更高版本,您可以使用
importlib.util
< /a> 直接将任意位置的 .py 文件作为模块导入,无需修改 sys.path 。file_name
参数必须是字符串或类似路径的对象。module_name
参数是必需的,因为所有加载的 Python 模块都必须有一个(点)模块名称(例如sys
、importlib
或importlib .util
),但您可以为这个新模块选择任何可用的名称。您可以这样使用此函数:
使用
load_module()
函数将其导入到 Python 进程后,该模块将可以使用为其指定的模块名称进行导入。file.py
:one.py
:two.py
:给定上面的文件,您可以运行以下命令来查看
file.py
变得可导入。这个答案基于官方Python文档:
importlib
:直接导入源文件。Using Python 3.5 or later, you can use
importlib.util
to directly import a.py
file in an arbitrary location as a module without needing to modifysys.path
.The
file_name
parameter must be a string or a path-like object. Themodule_name
parameter is required because all loaded Python modules must have a (dotted) module name (likesys
,importlib
, orimportlib.util
), but you can choose any available name you want for this new module.You can use this function like this:
After it has been imported once into the Python process using the
load_module()
function, the module will be importable using the module name given to it.file.py
:one.py
:two.py
:Given the files above, you can run the following command to see how
file.py
became importable.This answer is based on the official Python documentation:
importlib
: Importing a source file directly.我想添加这个注释,但我在其他地方不太清楚;在模块/包内,从文件加载时,模块/包名称必须以
mymodule
为前缀。想象一下mymodule
的布局如下:当从
__init__.py
加载somefile.py
/otherstuff.py
时,内容应该看起来像:I'd like to add this note I don't very clearly elsewhere; inside a module/package, when loading from files, the module/package name must be prefixed with the
mymodule
. Imaginemymodule
being layout like this:When loading
somefile.py
/otherstuff.py
from__init__.py
the contents should look like:要导入任何 .py 文件,您可以使用上面的代码。
首先附加路径,然后导入
注意:'../input/tokenization'目录包含tokenization.py文件
To import any .py file, you can use above code.
First append the path and then import
Note:'../input/tokenization' directory contains tokenization.py file
导入 .py 文件的最佳方法是通过
__init__.py
。最简单的方法是在 .py 文件所在的同一目录中创建一个名为 __init__.py 的空文件。Mike Grouchy 的这篇 帖子 很好地解释了
__init__.py
及其用于制作、导入和设置 python 包的用途。the best way to import .py files is by way of
__init__.py
. the simplest thing to do, is to create an empty file named__init__.py
in the same directory that your.py file is located.this post by Mike Grouchy is a great explanation of
__init__.py
and its use for making, importing, and setting up python packages.我的导入方式是导入文件并使用其名称的简写。
不要忘记您的导入文件必须以 .py 扩展名命名
How I import is import the file and use shorthand of it's name.
Don't forget that your importing file MUST BE named with .py extension
有几种方法可以包含名称为 abc.py 的 python 脚本,
限制是您的文件应该与调用 python 脚本位于同一位置。
如果您的 python 脚本已更新并且您不想上传 - 使用这些语句进行自动刷新。奖金 :)
There are couple of ways of including your python script with name abc.py
Limitation is that your file should be present in the same location where your calling python script is.
In case your python script gets updated and you don't want to upload - use these statements for auto refresh. Bonus :)
这帮助我使用 Visual Studio Code 构建我的 Python 项目。
当您未在目录中声明
__init__.py
时,可能会导致此问题。并且该目录成为隐式命名空间包
。这是关于 Python 导入和项目结构< /a>.另外,如果您想使用 Visual Studio Code 运行按钮 在顶部栏中,其脚本不在主包内,您可以尝试从实际目录运行控制台。
例如,您想要执行测试包中打开的
test_game_item.py
,并且您在omission
(主包)目录中打开了 Visual Studio Code:目录结构来自[2]。
您可以尝试设置:
(Windows) Ctrl + Shift + P → 首选项:打开设置 (JSON) 。
将此行添加到您的用户设置中:
此问题。
This helped me to structure my Python project with Visual Studio Code.
The problem could be caused when you don't declare
__init__.py
inside the directory. And the directory becomesimplicit namespace package
. Here is a nice summary about Python imports and project structure.Also if you want to use the Visual Studio Code run button in the top bar with a script which is not inside the main package, you may try to run console from the actual directory.
For example, you want to execute an opened
test_game_item.py
from the tests package and you have Visual Studio Code opened inomission
(main package) directory:The directory structure is from [2].
You can try set this:
(Windows) Ctrl + Shift + P → Preferences: Open Settings (JSON).
Add this line to your user settings:
A more comprehensive answer also for other systems is in this question.
如果您要导入的模块不在子目录中,请尝试以下操作并从最深的公共目录运行
app.py
父目录:目录结构:
在
app.py
中,将客户端路径附加到sys.path:可选(如果加载例如配置)(检查似乎是我的用例中最强大的一个)
运行
这个解决方案适用于 cli 和 PyCharm。
In case the module you want to import is not in a sub-directory, then try the following and run
app.py
from the deepest common parent directory:Directory Structure:
In
app.py
, append path of client to sys.path:Optional (If you load e.g. configs) (Inspect seems to be the most robust one for my use cases)
Run
This solution works for me in cli, as well as PyCharm.
这就是我从 python 文件调用函数的方法,这对我来说可以灵活地调用任何函数。
This is how I did to call a function from a python file, that is flexible for me to call any functions.
只是为了在另一个 python 文件中导入 python 文件
,假设我有 helper.py python 文件,它具有显示功能,例如,
现在在 app.py 中,您可以使用显示函数,
输出,
I'mworking sundar gsv
注意: 无需指定 .py 扩展名。
Just to import python file in another python file
lets say I have helper.py python file which has a display function like,
Now in app.py, you can use the display function,
The output,
I'm working sundar gsv
NOTE: No need to specify the .py extension.
Python 的一个非常不为人知的功能是能够导入
zip
文件:包的文件
__init__.py
包含以下内容:我们可以编写另一个可以导入包的脚本来自 zip 存档。只需将 zip 文件添加到 sys.path 即可。
One very unknown feature of Python is the ability to import
zip
files:The file
__init__.py
of the package contains the following:We can write another script which can import a package from the zip archive. It is only necessary to add the zip file to the sys.path.
这可能听起来很疯狂,但如果您只是为其创建包装脚本,则可以创建指向要导入的文件的符号链接。
This may sound crazy but you can just create a symbolic link to the file you want to import if you're just creating a wrapper script to it.
您还可以执行以下操作:
from filename import Something
示例:
from client import Client
请注意,您不需要
.py .pyw .pyui
扩展名。You can also do this:
from filename import something
example:
from client import Client
Note that you do not need the
.py .pyw .pyui
extension.如上所述,有很多方法,但我发现我只想导入文件的内容,并且不想必须编写行和行并且必须导入其他模块。因此,我想出了一种获取文件内容的方法,即使使用点语法 (
file.property
),而不是将导入的文件与您的文件合并。首先,这是我要导入的文件,
data.py
注意:您可以使用
.txt
扩展名反而。在
mainfile.py
中,首先打开并获取内容。现在您已将内容作为字符串,但尝试访问
data.testString
将导致错误,因为data
是str
的实例类,即使它确实有一个属性testString
,它也不会执行您期望的操作。接下来,创建一个类。例如(双关语),
ImportedFile
并将其放入其中(使用适当的缩进):
最后,像这样重新分配
data
:就是这样!只需像访问任何其他模块一样进行访问,输入
print(data.testString)
将在控制台上打印用于导入和测试的字符串文字
。但是,如果您想要
from mod import *
的等价物,只需删除类、实例分配,然后取消exec
的缩进即可。希望这有帮助:)
-本吉
There are many ways, as listed above, but I find that I just want to import he contents of a file, and don't want to have to write lines and lines and have to import other modules. So, I came up with a way to get the contents of a file, even with the dot syntax (
file.property
) as opposed to merging the imported file with yours.First of all, here is my file which I'll import,
data.py
Note: You could use the
.txt
extension instead.In
mainfile.py
, start by opening and getting the contents.Now you have the contents as a string, but trying to access
data.testString
will cause an error, asdata
is an instance of thestr
class, and even if it does have a propertytestString
it will not do what you expected.Next, create a class. For instance (pun intended),
ImportedFile
And put this into it (with the appropriate indentation):
And finally, re-assign
data
like so:And that's it! Just access like you would for any-other module, typing
print(data.testString)
will print to the consoleA string literal to import and test with
.If, however, you want the equivalent of
from mod import *
just drop the class, instance assignment, and de-dent theexec
.Hope this helps:)
-Benji
然后转到您的 x 文件并放置上述命令。要测试这一点,只需在 y 文件中添加一个打印函数,当导入成功后,它应该在 x 文件中打印它。
then go to your x file and place the above command. To test this just put a print function in your y file and when your import was successful then in x file it should print it.