相关疑难解决方法(0)

相对进口数十亿次

我来过这里:

还有很多我没有复制的网址,有些在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 import relative-path python-2.7

564
推荐指数
8
解决办法
17万
查看次数

如何在目录中运行所有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 testing unit-testing python-unittest

268
推荐指数
10
解决办法
18万
查看次数

尝试导入时,可以在Python文件中使用破折号吗?

基本上我有一个python文件,如:

python-code.py
Run Code Online (Sandbox Code Playgroud)

并使用:

import (python-code)
Run Code Online (Sandbox Code Playgroud)

解释器给我语法错误.

关于如何修复它的任何想法?破折号是否在python文件名中是非法的?

python naming

132
推荐指数
6
解决办法
6万
查看次数

运行测试时Python导入src模块

我的源文件位于src下,我的测试文件位于测试中.当我想运行一个测试文件时,比如python myTest.py,我收到一个导入错误:"没有名为ASourceModule.py的模块".

如何从运行我的测试所需的源导入所有模块?

python import unit-testing

35
推荐指数
4
解决办法
2万
查看次数

如果它们在姐妹文件夹中,如何使我的Python单元测试导入测试模块?

我仍然围绕import声明.如果我在同一级别有2个文件夹:

  1. SRC
  2. 测试

如何pytest导入模块的文件中src?有没有更好的解决方案(比如将文件夹放在另一个文件夹中?)

python directory import code-organization python-unittest

16
推荐指数
2
解决办法
1万
查看次数

什么是Python开源项目的正常结构,以及运行测试的首选方式是什么?

我写了一些我想分享的代码,我想遵循创建/维护它的结构的最佳实践.我将在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 open-source unit-testing project-structure

9
推荐指数
1
解决办法
562
查看次数

在python中在哪里放置子包的测试?

当一个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 testing nested directory-structure package

5
推荐指数
1
解决办法
813
查看次数

Python单元测试找不到模块

我有一个关于如何在 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 的情况下导入。

python-3.x python-unittest

5
推荐指数
1
解决办法
2万
查看次数

使用“-s”和“-t”的 Python 单元测试会抛出断言错误:路径必须在项目内

我想为我的项目执行单元测试。在项目根目录中,我使用一个src文件夹来存放我的代码和一个tests文件夹来存放我的单元测试。这是我的项目结构:

\n
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\n
Run Code Online (Sandbox Code Playgroud)\n

内容func.py

\n
def func():\n    return True\n
Run Code Online (Sandbox Code Playgroud)\n

内容test.py

\n
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()\n
Run Code Online (Sandbox Code Playgroud)\n

目前,我不想将我的代码作为模块提供。这就是为什么没有__init__.py内部src,我导入我的代码来测试__import__()

\n

如果我通过执行我的单元测试python -m unittest discover -s tests -t src,我会收到以下错误消息:

\n
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)

python-3.x python-unittest

5
推荐指数
2
解决办法
1717
查看次数

Python unittest无法解析import语句

我有一个类似于以下的文件结构

project
    src
        __init__.py
        main.py
        module.py
        secondary.py
    test
        test_module.py        
Run Code Online (Sandbox Code Playgroud)

module.py

import secondary
x = False
Run Code Online (Sandbox Code Playgroud)

secondary.py

pass
Run Code Online (Sandbox Code Playgroud)

test_module.py

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 unit-testing python-3.x python-unittest

4
推荐指数
1
解决办法
2523
查看次数

简单的 python 导入失败

我对为什么简单的绝对导入失败感到困惑。按照 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。)这不应该那么复杂——需要什么语法才能让 …

python

4
推荐指数
1
解决办法
162
查看次数

从 CMake 运行 pytest 测试,其中测试和源位于不同的文件夹中

我有一个使用 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或测试移出test
  • set_tests_properties 可以设置环境变量。

我认为设置PYTHONPATH=.../src/mypyspace应该有效,但这也会忽略对用户的更改PYTHONPATH

python cmake pytest python-3.x

4
推荐指数
1
解决办法
3608
查看次数

如何从python中的tests模块导入src

我有一个应用程序,我想测试使用,unittest但我有一些问题.我的目录结构如下:

root_dir
??? src
?   ??? cmds
?   ?   ??? baz.py
?   ?   ??? __init__.py
?   ?   ??? bar.py
?   ??? foo.py
??? tests
    ??? cmds.py
    ??? __init__.py
Run Code Online (Sandbox Code Playgroud)

我想测试bazbar模块cmds,我正在尝试

root_dir> python2.7 -m unittest tests.cmds

但是tests.cmds我无法导入cmds我的src目录中的包.

我怎样才能做到这一点?

基本上我想root_dirsrctests目录分别测试应用程序.

我试图追加srcsys.path,但是当我导入cmds.baztests/cmds.py我还是得到一个AttributeError: 'module' object has no attribute 'cmds'从单元测试.

编辑:我的导入和sys.path声明是:

import sys
sys.path.append('../src') …
Run Code Online (Sandbox Code Playgroud)

python unit-testing

2
推荐指数
1
解决办法
1588
查看次数