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

文件(例如file.py) 一个文件夹 在运行时根据用户输入动态地生成文件 文件的特定部分(例如,单个函数)


当前回答

如果你想导入的模块不在子目录中,那么尝试以下方法并从最深的公共父目录运行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")

Run

user@host:/path/to/common_dir$ python3 application/app.py

这个解决方案适用于我的cli,以及PyCharm。

其他回答

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

and

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

以下是我现在已经理解的两种简单方法,确保你想导入的“file.py”文件只存在于你的当前目录中。

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

这帮助我用Visual Studio Code构建我的Python项目。

当你没有在目录中声明__init__.py时,可能会导致这个问题。目录变成隐式的名称空间包。下面是关于Python导入和项目结构的一个很好的总结。

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

例如,你想要从测试包中执行一个打开的test_game_item.py,并且你有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→Preferences: Open Settings (JSON)。

将这一行添加到用户设置中:

"python.terminal.executeInFileDir": true

对于其他系统,更全面的答案也在这个问题中。

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

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

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

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

第一个案例 你想导入文件A.py到文件B.py中,这两个文件在同一个文件夹中,就像这样:

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

你可以在文件B.py中这样做:

import A

or

from A import *

or

from A import THINGS_YOU_WANT_TO_IMPORT_IN_A

然后你就可以在B.py文件中使用A.py文件中的所有函数了


第二个案例 你想导入B.py文件中的/A.py文件夹,这两个文件不在同一个文件夹中,就像这样:

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

你可以在文件B.py中这样做:

import folder.A

or

from folder.A import *

or

from folder.A import THINGS_YOU_WANT_TO_IMPORT_IN_A

然后你就可以在B.py文件中使用A.py文件中的所有函数了


总结

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

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