为什么删除顶级包?蟒蛇

时间:2016-02-17 17:13:34

标签: python import package

我为我目前正在处理的其中一个项目创建了一个cv::Mat包。顶部包名为std::vector<cv::Rect>,内部包含另一个名为cv::Size的名称和测试名称。我通过Python安装了模块:生成了integration dist,并已安装。此外,还有一个名为testcases的顶级脚本已复制到命令行。 目录结构如下所示:

pip

因此,从命令行开始,在pip wheels之后,我运行:

integration

一切顺利,直到它开始导入包:

project/
    __init__.py
    integration/
         README.md
         __init__.py
         integration # script
         testcases/
              __init__.py
              foo_test.py
              bar_test.py

当然我没有尝试加载pip install:我通过了integration --wait-time 1 。在终端做同样的事情我成功了:

*** Update *****
# os.getcwd() : /home/ubuntu/project
*****
2016-02-17 17:03:25 - project - INFO - Module: integration.testcases.bar_test
2016-02-17 17:03:25 - project - INFO - class_str: BarTest
2016-02-17 17:03:25 - project - INFO - class_data: [u'bar_test', u'py']
2016-02-17 17:03:25 - project - ERROR - Failed to instantiate class integration.testcases.bar_test
Traceback (most recent call last):
  File "/usr/local/bin/integration", line 131, in load_class
    module = importlib.import_module(module_path)
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
ImportError: No module named testcases.bar_test
2016-02-17 17:03:25 - project - ERROR - No module named testcases.bar_test
Traceback (most recent call last):
  File "/usr/local/bin/integration", line 131, in load_class
    module = importlib.import_module(module_path)
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)

这是导入这些类的方法的源代码:

testcases.bar_test

integration.testcases.bar_test只会将ubuntu@ip-10-3-6-9:~$ python Python 2.7.6 (default, Jun 22 2015, 17:58:13) [GCC 4.8.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import importlib >>> module = importlib.import_module('integration.testcases.bar_test') 2016-02-17 17:10:00 - easyprocess - DEBUG - version=0.2.2 2016-02-17 17:10:00 - pyvirtualdisplay - DEBUG - version=0.1.5 替换为try: # filename -> bar_test.py # class_str -> BarTest class_data = filename.split(".") current_path = "{0}.{1}".format("integration.testcases", class_data[0]) module_path = self.format_path(current_path) self.log.info("Module: %s" % module_path) module = importlib.import_module(module_path) return getattr(module, class_str) except Exception, e: self.log.exception("Failed to instantiate class %s" % module_path) self.log.exception(e) ,而不是其他任何内容,所以

format_path(path)

我想知道为什么'/'使用'.'代替foo/bar/bat -> foo.bar.bat 。有线索吗?

1 个答案:

答案 0 :(得分:0)

您从/home/ubuntu运行此操作的事实很重要。 Python iterpreter搜索模块的方式描述为here

在您的情况下调查它们在哪里寻找:

import sys
print sys.path

如果/home/ubuntu/project1不存在,则import integration.whatever将失败。

然后你有3个选择:
- 将您的输入脚本放在/home/ubuntu/project1文件夹中 - 将/home/ubuntu/project1添加到PYTHONPATH环境变量
- 在您的输入脚本中将/home/ubuntu/project1添加到sys.path