在Python 3中,绝对导入位于不同目录中的模块的pythonic方法是什么?我可以通过修改sys.path
导入模块,但该方法是hackey。
根据我的阅读,替代方法是将项目转换为pip可安装包。这是超出我的方法,有人可以详细说明这个过程和逻辑吗?在编写setup.py
脚本后,我只是python setup.py install
,那么我的所有模块和包都在正确的路径中并且可以工作吗?
答案 0 :(得分:2)
import importlib.machinery
import imp
import os.path
path = '/home/user/testscript' # without .py
fname = os.path.basename(path)
namespace = fname.replace(' ', '_').strip('\\/;,. ')
loader = importlib.machinery.SourceFileLoader(namespace, os.path.abspath(path+'.py'))
handle = loader.load_module(namespace)
imp.reload(handle)
ret = handle.mainFunction()
handle
是您的图书馆名称。我只是称它为句柄,因为我自己在一次性测试库中使用它,所以它在循环的每次迭代中都会被删除。
很抱歉语法问题,请在手机上写下来。我会在几分钟内纠正任何语法问题或缩进问题。
import importlib.machinery
# Register the "mylib" namespace as "test.py"
loader = importlib.machinery.SourceFileLoader("mylib", r'C:\Users\OpenWindows\Desktop\test.py')
# And load that namespace
mylib = loader.load_module("mylib")
# And now we can call it whenever we want.
ret = mylib.someFunction()
只需创建一个如下所示的文件夹结构:
|- main.py
|-- mylib /
|-- __init__.py
|-- mylib.py
在__init__.py
文件中创建一些类似于:
from mylib.mylib import *
这样,mylib.py
中的任何函数或类都将被导入,就好像它位于main.py
中一样。但是,这又严重依赖于与您正在执行的脚本位于同一文件夹中的子文件夹。但它也是向应用程序发送/添加功能的传统方式。
您可以在__init__.py
文件中执行其他一些可能有用的操作。看看文档。
答案 1 :(得分:0)
我很长一段时间都在努力解决这个问题,并找到了创建setup.py
文件的最佳方法,如你所提到的 - 不用担心,这很容易。基本的看起来像这样(taken from python documentation):
from distutils.core import setup
setup(name='foo',
version='1.0',
py_modules=['foo'],
)
然后使用-e
选项使用pip安装它:
pip install -e <path-to-your-project>
这样你就告诉python在你的项目目录中寻找模块。