【问题标题】:Running python unit-test cannot find my files in the correct directory to import运行 python unit-test 在要导入的正确目录中找不到我的文件
【发布时间】:2017-10-16 05:28:22
【问题描述】:

这就是我的代码在下面的代码框中的样子。当我运行它时,my_dir 和 network_json 的结果分别是:

my_dir: C:\Users\sepham\My Documents\LiClipse Workspace\sengtool_data_funnel

network_json:

C:\Users\sepham\My Documents\LiClipse Workspace\sengtool_data_funnel\example_EventsOfInterestColumnAggregate.json

但是我的test_json_networks.py文件的项目目录结构如下:

C:\Users\sepham\Documents\LiClipse Workspace\sengtool_data_funnel\tests\test_networks

json_files_input = [
                'example_EventsOfInterestColumnAggregate.json',
                'example_EventsOfInterestConcatenate.json']
@pytest.mark.parametrize('network_json', json_files_input)
def test_network_jsons(network_json):

    my_dir = os.path.dirname(os.path.abspath(network_json))
    network_json = os.path.join(my_dir, network_json)

    print my_dir
    print network_json

    with open(network_json) as jdata:
        network = Network.load(json.load(jdata))

打印语句的结果:

======================== CAPTURED OUTPUT =========================
C:\Users\sepham\My Documents\LiClipse Workspace\sengtool_data_funnel
C:\Users\sepham\My Documents\LiClipse 
Workspace\sengtool_data_funnel\example_EventsOfInterestColumnAggregate.json

问题是我需要为 Python 单元测试设置什么环境变量或设置,以便它可以在正确的目录中看到我的文件:

C:\Users\sepham\Documents\LiClipse Workspace\sengtool_data_funnel\tests\test_networks

顺便说一句,我正在使用 LiClipse IDE。

另外,这是运行 python unit-test 时的错误消息,因为它看不到要导入的文件:

E IOError: [Errno 2] No such file or directory: 'C:\\Users\\sepham\\My 
Documents\\LiClipse 
Workspace\\sengtool_data_funnel\\example_EventsOfInterestCo‌​
lumnAggregate.json' 

File "C:\Users\sepham\My Documents\LiClipse 
Workspace\sengtool_data_funnel\tests\test_networks\test_json‌​_networks.py", 
line 58 IOError

如果我将要导入的文件放在下面的目录中,那么它可以正常工作:

C:\Users\sepham\My Documents\LiClipse Workspace\sengtool_data_funnel

【问题讨论】:

    标签: python import directory python-unittest


    【解决方案1】:

    总结您的问题:

    您有以下项目结构:

    - sengtool_data_funnel (project root)
      - tests
        - test_networks
          - test_json‌​_networks.py
          - example_EventsOfInterestColumnAggregate.json
          - example_EventsOfInterestConcatenate.json
    

    当您运行测试时,工作目录是 sengtool_data_funnel 而不是 JSON 文件所在的 sengtool_data_funnel/tests/test_networks。因此你遇到了异常。

    为什么项目根目录是默认工作目录

    通常,当您编写测试时,您会想要测试项目结构中的代码。 Python 将在工作目录中查找模块(当然还有已安装的包)。

    如果您的工作目录不是项目根目录,那么您可能会开始发现很难加载不在该目录中的任何模块(例如,在父目录中)。即使是同一目录中的模块也可能有问题。那是因为绝对包结构不再匹配您的项目结构。您最终可能会使用修改sys.path 之类的技巧。

    这就是为什么默认工作目录是项目根目录的原因,它应该保持这种状态。

    你能做什么?

    现在假设工作目录确实是项目根目录,我们有几个选择。

    首先,您可以简单地加载 sengtool_data_funnel/tests/test_networks/example_EventsOfInterestConcatenate.json 而不是 example_EventsOfInterestConcatenate.json

    或者,您可以加载与您的测试脚本相关的文件。 Python 为您的测试脚本定义了__file__。即os.path.dirname(__file__) 在这种情况下将指向sengtool_data_funnel/tests/test_networks。您可以将脚本更改为:

    my_dir = os.path.dirname(__file__)
    network_json = os.path.join(my_dir, network_json)
    

    这样做的好处是,如果您更改了工作目录,它仍然可以工作(尽管我不知道您为什么要这样做)。

    【讨论】:

      【解决方案2】:

      也许你可以在你的 python 文件 test_json_networks.py 中使用 sys 模块 在文件的开头

      import sys
      sys.path.append('C:\Users\sepham\Documents\LiClipse Workspace\sengtool_data_funnel')
      

      这应该可以解决你的问题

      【讨论】:

        【解决方案3】:

        好吧,在浪费了很多时间之后,我终于找到了自己的答案。 如果要在项目主目录的子目录中导入文件进行测试,则需要在 LiClipse IDE 中进行以下操作。

        右击test_name.py文件

        运行方式 >> 运行配置

        选择你的文件名

        (x)= 参数选项卡

        工作目录 >> 文件系统

        选择你的目录

        【讨论】:

        • 如果它适合我​​,我更喜欢不依赖某人导航特定 IDE 的 UI 的解决方案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-10
        • 2018-03-21
        • 2017-03-06
        • 1970-01-01
        相关资源
        最近更新 更多