繁体   English   中英

从不同目录导入模块

[英]Importing modules from different directories

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

根据我所读的内容,另一种方法是将项目变成pip可安装的程序包。 这是我以外的方法,有人可以详细说明这个过程和逻辑吗? 编写setup.py脚本后,我是否只是python setup.py install ,那么我所有的模块和软件包都在正确的路径中并且可以正常工作?

通过给定路径从任何地方动态加载脚本

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您的库名。 我之所以称它为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任何函数或类mylib.py将被导入,就像驻留在main.py 但是,这再次很大程度上取决于与您正在执行的脚本位于同一文件夹中的子文件夹。 但这也是向应用程序交付功能或添加功能的传统方式。

您可以在__init__.py文件中做一些其他有用的事情。 看一下文档。

我在这个问题上苦苦挣扎了很长时间,并且找到了创建setup.py文件的最佳方法,就像您提到的那样-不用担心,这很容易。 基本的代码如下所示( 取自python文档 ):

from distutils.core import setup
setup(name='foo',
  version='1.0',
  py_modules=['foo'],
  )

然后使用-e选项通过pip安装它:

 pip install -e <path-to-your-project>

这样,您告诉python在您的项目目录中查找模块。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM