从其他目录导入自定义模块

时间:2016-06-14 09:03:31

标签: python python-import importerror

假设我有一个自定义模块:

/basexx_yy/subdir1/subdir2/subdir3/subdir4/custom_module.py

需要导入custom_module.py的脚本位于:

/basexx_yy/subdir1/otherdir/script.py

basexx_yy是一个带有动态名称的目录,请将xxyy视为时间戳,但为了清楚起见,xx是一周(01 =星期一 - 05 =星期五),yy是星期数(subdir1 - subdir4是常数)。因此custom_module.py的完整路径不能作为静态地址包含在内。由于子目录是常量,我编写了以下代码:

import os
import sys
cwd = os.getcwd()
split = cwd.split('\\')
if 'subdir1' in split:
    parentdir = cwd.split('subdir1')
    sys.path.insert(0, os.path.join(parentdir[0], 'subdir1', 'subdir2', 'subdir3', 'subdir4'))
else:
    sys.exit("'subdir' dir not found! Run the script from within basedir.")

import custom_module
然而,它不起作用。我很欣赏一些清晰度,因为我无法理解为什么这不起作用。

2 个答案:

答案 0 :(得分:2)

从你的问题来看,你的情况并不完全清楚,但是这里的设计用于

  • 包含setup.py,可以使用pip进行安装。
  • 模块位于包或模块中,包含__init__.py

您的包应该具有类似

的结构
setup.py
basexx_yy/
          __init__.py
          something_else.py
          subdir1/
                  __init__.py
                  more_files.py
                  otherdir/
                           script.py
                  subdir2/
                          __init__.py
                          etc.py
                          subdir3/
                                  __init__.py
                                  pp.py
                                  subdir4/
                                          __init__.py
                                          custom_module.py

basexx_yy是一个包意味着它可以使用

安装到你的python库集合中
pip install basexx_yy

或者,在开发时

pip install -e basexx_yy

之后任何脚本(甚至可能完全在你的包裹之外)都可以

import basexx_yy

并且深入导入如

import basexx_yy.subdir1.subdir2.subdir3.subdir4.custom_module as cm

cm.sqrt(4)

或者,模块树中的任何文件(otherdir缺少__init__.py,因此它在模块树之外,不能执行此操作)可以执行相对导入。

e.g。 custom_module.py可以

from . import custom_modules
from .. import pp
from ... import etc
from .... import more_files
from ..... import something_else

答案 1 :(得分:0)

我同意Nils Werner的意见,你很可能想重组你的包裹。

无论如何,你的代码应该可行!唯一的问题是你使用

var myApp = angular.module('myApp', []);
myApp.controller('appCtrl', function($scope) {
  $scope.var = {
    test: true
  }
})

而不是

split = cwd.split('\\')