从不同目录导入模块

时间:2016-05-25 18:50:38

标签: python python-3.x import packaging setup.py

在Python 3中,绝对导入位于不同目录中的模块的pythonic方法是什么?我可以通过修改sys.path导入模块,但该方法是hackey。

根据我的阅读,替代方法是将项目转换为pip可安装包。这是超出我的方法,有人可以详细说明这个过程和逻辑吗?在编写setup.py脚本后,我只是python setup.py install,那么我的所有模块和包都在正确的路径中并且可以工作吗?

2 个答案:

答案 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在你的项目目录中寻找模块。