我来过这里:
还有很多我没有复制的网址,有些在SO上,有些在其他网站上,当我认为我有快速解决方案的时候.
永远反复出现的问题是:使用Windows 7,32位Python 2.7.3,如何解决这个"非包装中尝试相对导入"的消息?我在pep-0328上构建了一个包的精确副本:
package/
__init__.py
subpackage1/
__init__.py
moduleX.py
moduleY.py
subpackage2/
__init__.py
moduleZ.py
moduleA.py
Run Code Online (Sandbox Code Playgroud)
我确实在适当的模块中创建了名为spam和eggs的函数.当然,它没有用.答案显然在我列出的第4个网址中,但这对我来说都是校友.我访问过的其中一个网址上有此回复:
相对导入使用模块的name属性来确定模块在包层次结构中的位置.如果模块的名称不包含任何包信息(例如,它设置为'main'),则解析相对导入,就像模块是顶级模块一样,无论模块实际位于文件系统的哪个位置.
上面的反应看起来很有希望,但它对我来说都是象形文字.所以我的问题是,如何让Python不回归"尝试非包装中的相对导入"?有一个答案涉及-m,据说.
有人可以告诉我为什么Python会给出错误信息,非包装意味着什么!,为什么以及如何定义"包裹",并且准确的答案足以让幼儿园儿童理解.
编辑:导入是从控制台完成的.
我有一个包含我的Python单元测试的目录.每个单元测试模块的形式为test _*.py.我正在尝试创建一个名为all_test.py的文件,您猜对了,运行上述测试表单中的所有文件并返回结果.到目前为止,我尝试了两种方法; 都失败了.我将展示这两种方法,我希望那里的人知道如何正确地做到这一点.
对于我的第一次勇敢的尝试,我想"如果我只是在文件中导入我的所有测试模块,然后调用这个unittest.main()doodad,它会工作,对吧?" 好吧,事实证明我错了.
import glob
import unittest
testSuite = unittest.TestSuite()
test_file_strings = glob.glob('test_*.py')
module_strings = [str[0:len(str)-3] for str in test_file_strings]
if __name__ == "__main__":
unittest.main()
Run Code Online (Sandbox Code Playgroud)
这不起作用,我得到的结果是:
$ python all_test.py
----------------------------------------------------------------------
Ran 0 tests in 0.000s
OK
Run Code Online (Sandbox Code Playgroud)
对于我的第二次尝试,我可以,也许我会尝试以更"手动"的方式完成整个测试.所以我试着在下面这样做:
import glob
import unittest
testSuite = unittest.TestSuite()
test_file_strings = glob.glob('test_*.py')
module_strings = [str[0:len(str)-3] for str in test_file_strings]
[__import__(str) for str in module_strings]
suites = [unittest.TestLoader().loadTestsFromName(str) for str in module_strings]
[testSuite.addTest(suite) for suite in suites]
print …Run Code Online (Sandbox Code Playgroud) 基本上我有一个python文件,如:
python-code.py
Run Code Online (Sandbox Code Playgroud)
并使用:
import (python-code)
Run Code Online (Sandbox Code Playgroud)
解释器给我语法错误.
关于如何修复它的任何想法?破折号是否在python文件名中是非法的?
我的源文件位于src下,我的测试文件位于测试中.当我想运行一个测试文件时,比如python myTest.py,我收到一个导入错误:"没有名为ASourceModule.py的模块".
如何从运行我的测试所需的源导入所有模块?
我仍然围绕import声明.如果我在同一级别有2个文件夹:
如何py在test导入模块的文件中src?有没有更好的解决方案(比如将文件夹放在另一个文件夹中?)
我写了一些我想分享的代码,我想遵循创建/维护它的结构的最佳实践.我将在BitBucket上托管代码,现在我正在考虑如何组织它.这是一个很好的结构吗?
project_name/
lib/
test/
README
Run Code Online (Sandbox Code Playgroud)
所以,这将有lib中的源代码和测试中的测试.这是在Python项目中完成的吗?这是我看到的最常用于Ruby项目的结构.另外,当我运行单元测试时,这样做是不错的做法:
set PYTHONPATH=`pwd`/lib
python test/a_test.py
Run Code Online (Sandbox Code Playgroud) 当一个python模块有多个子包时,这些子包中的特性测试应该放在哪里?
我可以看到两种方法可以做到:
test在每个子包中创建一个单独的文件夹并将其测试放在那里。test文件夹中的包层次结构,将每个子包的测试放在相应的文件夹中。但是,尚不清楚应该首选哪个选项。
对于这样foo安排的包:
foo/
__init__.py
bar.py
baz/
__init__.py
baz.py
Run Code Online (Sandbox Code Playgroud)
我把测试放在这里吗?
foo/
__init__.py
bar.py
baz/
__init__.py
baz.py
test/
__init__.py
test_bar.py
baz/
__init__.py
test_baz.py
Run Code Online (Sandbox Code Playgroud)
还是这里?
foo/
__init__.py
bar.py
baz/
__init__.py
baz.py
test/
__init__.py
test_baz.py
test/
__init__.py
test_bar.py
Run Code Online (Sandbox Code Playgroud) 我有一个关于如何在 python 单元测试模块中正确导入模块的问题。这是我的目录结构
project -
| _ Library _
| |_ TimeCalculator.py
| _ Test _
|_ UnittestFile.py
Run Code Online (Sandbox Code Playgroud)
我想测试 TimeCalculator.py 中的函数,所以在 UnittestFile.py 中我写
from .Library.TimeCalculator import TimeCalculator
Run Code Online (Sandbox Code Playgroud)
但出现错误,提示ImportError:尝试在没有已知父包的情况下进行相对导入
我想问在这种情况下如何在不设置 PATH 的情况下导入。
我想为我的项目执行单元测试。在项目根目录中,我使用一个src文件夹来存放我的代码和一个tests文件夹来存放我的单元测试。这是我的项目结构:
project/\n\xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src/\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 func.py\n|\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tests/\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test.py\nRun Code Online (Sandbox Code Playgroud)\n内容func.py:
def func():\n return True\nRun Code Online (Sandbox Code Playgroud)\n内容test.py:
import unittest\n\ntarget = __import__("func.py")\nfunc = target.func\n\nclass TestFunc(unittest.TestCase):\n def test_func(self):\n self.assertTrue(func())\n\nif __name__ == \'__main__\':\n unittest.main()\nRun Code Online (Sandbox Code Playgroud)\n目前,我不想将我的代码作为模块提供。这就是为什么没有__init__.py内部src,我导入我的代码来测试__import__()。
如果我通过执行我的单元测试python -m unittest discover -s tests -t src,我会收到以下错误消息:
PS C:\\Users\\username\\Desktop\\project> python -m unittest discover -s tests -t src\nTraceback (most recent call last):\n File "C:\\Users\\username\\AppData\\Local\\Programs\\Python\\Python39\\lib\\runpy.py", line …Run Code Online (Sandbox Code Playgroud) 我有一个类似于以下的文件结构
project
src
__init__.py
main.py
module.py
secondary.py
test
test_module.py
Run Code Online (Sandbox Code Playgroud)
import secondary
x = False
Run Code Online (Sandbox Code Playgroud)
pass
Run Code Online (Sandbox Code Playgroud)
from unittest import TestCase
from src import module
class ModuleTest(TestCase):
def test_module(self):
self.assertTrue(module.x)
Run Code Online (Sandbox Code Playgroud)
调用python3 -m unittest discover中/project/给出了一个错误:
File "/Users/Me/Code/project/test/test_module.py", line 6, in <module>
from src import module
File "/Users/Me/Code/project/src/module.py", line 1, in <module>
import secondary
ImportError: No module named 'secondary'
Run Code Online (Sandbox Code Playgroud)
我可以做什么,secondary.py导入没有错误?
我对为什么简单的绝对导入失败感到困惑。按照 Python包教程,我有一个带有单个子包的包:
sound/
__init__.py
top.py
formats/
__init__.py
a.py
b.py
Run Code Online (Sandbox Code Playgroud)
a.py 包含:
def foo():
print("foo")
Run Code Online (Sandbox Code Playgroud)
b.py 包含:
from a import foo
def bar():
foo()
if __name__ == "__main__":
bar()
Run Code Online (Sandbox Code Playgroud)
top.py 包含:
from formats import b
if __name__ == "__main__":
b.bar()
Run Code Online (Sandbox Code Playgroud)
两个__init__.py文件都是空的。从声音/格式/,foo按预期运行 b 打印。但是从 sound/,运行 top 会产生错误:
File ".../sound/top.py", line 1, in <module>
from formats import b
File "...\sound\format\b.py", line 1, in <module>
from a import foo
ImportError: No module named 'a'
Run Code Online (Sandbox Code Playgroud)
(注意第一行正斜杠和第二行反斜杠的奇怪外观。Python 3.5,Windows 7 Pro。)这不应该那么复杂——需要什么语法才能让 …
我有一个使用 C++ 和 python 源代码的基于 CMake 的项目。测试是通过add_test为文件夹结构中的所有 C++ 测试添加的,例如:
src
mynamespace/foo.cpp
mypyspace/mypkg/__init__.py
mypyspace/mypkg/bar.py
test
mynamespace/testFoo.cpp
mypyspace/testBar.py
Run Code Online (Sandbox Code Playgroud)
在testBar.py我有一个import mypkg并且想要运行它add_test(... COMMAND pytest WORKING_DIRECTORY .../test)
当然它没有找到我的包,但我也不想安装它(它需要在构建过程中生成一些东西,并且作为其他源的一部分积极开发)。
执行这些测试的正确/首选方法是什么?
笔记:
src或测试移出testset_tests_properties 可以设置环境变量。我认为设置PYTHONPATH=.../src/mypyspace应该有效,但这也会忽略对用户的更改PYTHONPATH。
我有一个应用程序,我想测试使用,unittest但我有一些问题.我的目录结构如下:
root_dir
??? src
? ??? cmds
? ? ??? baz.py
? ? ??? __init__.py
? ? ??? bar.py
? ??? foo.py
??? tests
??? cmds.py
??? __init__.py
Run Code Online (Sandbox Code Playgroud)
我想测试baz和bar模块cmds,我正在尝试
root_dir> python2.7 -m unittest tests.cmds
但是tests.cmds我无法导入cmds我的src目录中的包.
我怎样才能做到这一点?
基本上我想root_dir用src和tests目录分别测试应用程序.
我试图追加src到sys.path,但是当我导入cmds.baz从tests/cmds.py我还是得到一个AttributeError: 'module' object has no attribute 'cmds'从单元测试.
编辑:我的导入和sys.path声明是:
import sys
sys.path.append('../src') …Run Code Online (Sandbox Code Playgroud) python ×11
unit-testing ×5
python-3.x ×4
import ×3
testing ×2
cmake ×1
directory ×1
naming ×1
nested ×1
open-source ×1
package ×1
pytest ×1
python-2.7 ×1