我有这样的文件夹结构:
application
├── app
│ └── folder
│ └── file.py
└── app2
└── some_folder
└── some_file.py
如何从file.py或some_file.py中导入函数?我尝试了:
from application.app.folder.file import func_name
但它不起作用。
我有这样的文件夹结构:
application
├── app
│ └── folder
│ └── file.py
└── app2
└── some_folder
└── some_file.py
如何从file.py或some_file.py中导入函数?我尝试了:
from application.app.folder.file import func_name
但它不起作用。
当前回答
您可以使用importlib导入模块,其中您希望使用如下字符串从文件夹中导入模块:
import importlib
scriptName = 'Snake'
script = importlib.import_module('Scripts\\.%s' % scriptName)
这个示例有一个main.py,它是上面的代码,然后是一个名为Scripts的文件夹,然后您可以通过更改scriptName变量从这个文件夹中调用所需的任何内容。然后可以使用脚本引用此模块。例如,如果我在Snake模块中有一个名为Hello()的函数,您可以通过这样做来运行该函数:
script.Hello()
我已经在Python 3.6中测试过了
其他回答
将应用程序移动到其他环境时,使用带有绝对路径的sys.path.append并不理想。使用相对路径并不总是有效的,因为当前工作目录取决于脚本的调用方式。
由于应用程序文件夹结构是固定的,因此我们可以使用os.path获取要导入的模块的完整路径。例如,如果这是结构:
/home/me/application/app2/some_folder/vanilla.py
/home/me/application/app2/another_folder/mango.py
假设您要导入芒果模块。您可以在vanilla.py中执行以下操作:
import sys, os.path
mango_dir = (os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
+ '/another_folder/')
sys.path.append(mango_dir)
import mango
当然,您不需要mango_dir变量。
要了解其工作原理,请查看以下交互式会话示例:
>>> import os
>>> mydir = '/home/me/application/app2/some_folder'
>>> newdir = os.path.abspath(os.path.join(mydir, '..'))
>>> newdir
'/home/me/application/app2'
>>> newdir = os.path.abspath(os.path.join(mydir, '..')) + '/another_folder'
>>>
>>> newdir
'/home/me/application/app2/another_folder'
>>>
并检查os.path文档。
还值得注意的是,使用包时,处理多个文件夹更容易,因为可以使用虚线模块名称。
我也面临着同样的挑战,尤其是在导入多个文件时,这就是我如何克服的。
import os, sys
from os.path import dirname, join, abspath
sys.path.insert(0, abspath(join(dirname(__file__), '..')))
from root_folder import file_name
我正在处理项目a,我希望用户通过pip-install a使用以下文件列表进行安装:
.
├── setup.py
├── MANIFEST.in
└── a
├── __init__.py
├── a.py
└── b
├── __init__.py
└── b.py
设置.py
from setuptools import setup
setup (
name='a',
version='0.0.1',
packages=['a'],
package_data={
'a': ['b/*'],
},
)
歧管in
recursive-include b *.*
a/init.py
from __future__ import absolute_import
from a.a import cats
import a.b
a/a.py
cats = 0
a/b/init.py
from __future__ import absolute_import
from a.b.b import dogs
a/b/b.py
dogs = 1
我通过在MANIFEST.in目录下运行以下命令来安装模块:
python setup.py install
然后,在我的文件系统上的一个完全不同的位置上,我可以运行:
import a
dir(a)
这证实了a.ats确实等于0,a.b.dogs确实等于1,正如预期的那样。
将application作为python项目的根目录,在application、app和文件夹文件夹中创建一个空__init__.py文件。然后在some_file.py中进行如下更改以获得func_name的定义:
import sys
sys.path.insert(0, r'/from/root/directory/application')
from application.app.folder.file import func_name ## You can also use '*' wildcard to import all the functions in file.py file.
func_name()
name-file.py中的第一个导入系统
import sys
第二次在name-file.py中追加文件夹路径
sys.path.insert(0, '/the/folder/path/name-package/')
第三,在子目录中创建一个名为__init__.py的空白文件(这告诉Python它是一个包)
name-file.py名称包__初始化__.py名称模块.py
第四步导入name-file.py文件夹中的模块
from name-package import name-module