我的应用程序是用这种结构组织的:
main/
config/
__init__.py
# some source .py files
date/
__init__.py
# some source .py files
# some other sources/packages
main.py
__init__.py
bin/
app
**以上名称仅为示例。
app
文件也是if __name__ == "__main__":
内部调用main.py
文件主要功能的Python文件。
此应用程序运行良好,它可以在任何地方运行,运行app
文件。我们也已经在PyPI上上传了包,没有问题。
现在我试图编写一些调用主应用程序的回归测试(另一个Python源代码)。这些测试基本上是:
使用subprocess
模块及其功能check_output
,我正在运行app
文件,因此我运行类似
subprocess.check_output('..\bin\app')
当我运行回归测试时出现问题,然后出现ImportError: No module named
错误。我尝试了一些不同的东西,但我无法进行回归测试。
找不到的模块是我的应用程序中的模块,例如config
目录中的模块。我尝试过重构一些事情,但总是遇到同样错误的事情。但是,由于我的应用程序在我正常运行时运行良好,我认为错误是另一个错误的东西......
有人有想法吗?
谢谢!
答案 0 :(得分:0)
您尚未粘贴完整的错误消息。不能阻止您导入subprocess
的任何事情。也许你拼错了它:
>>> import subproces
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named subproces
>>> import subprocess
>>>
您的subprocess.check_output
代码存在另一个问题。假设您的代码或文件夹结构中没有任何其他错误影响导入,请更改
subprocess.check_output('..\bin\app')
到
subprocess.check_output('..\\bin\\app')
在Python和许多其他语言中,\
是escape character。正如\n
是换行符的转义序列一样,\a
也会发出哔哔声&#39;并且\b
是&#39;退格&#39;。
要看到这一点:
>>> print 'hello\bworld' # notice the missing letter in the output
hellworld
>>> print '\a' # you'd hear a beep
>>>
因此,您的字符串'..\bin\app'
会被解释为'..<backspace>in<bell>pp'
:
>>> print '..\bin\app'
.inpp
你会听到一声哔哔声。因此,您不太可能拥有具有该名称的文件,并且名称中会发出蜂鸣声*。
为了防止反斜杠(\
)表现得像转义字符,你必须使用反斜杠转义它:'\\'
>>> print '..\\bin\\app'
..\bin\app
*(理论上允许某些文件系统)