【问题标题】:Change sys.path upon execfile在 execfile 上更改 sys.path
【发布时间】:2017-04-14 10:15:53
【问题描述】:

我正在为我的 GitHub 存储库设置 Travis-CI,在创建测试时,我意识到我遇到了问题。

我的文件结构是这样的:

parent-dir:
    src:
        prog.py
        generator.py
    test:
        test.py

Travis 设置为运行 test.py 文件,然后依次执行以下命令:

variables = {'help': '-h'}
execfile(sys.path[0] + "/../src/prog.py", variables)

这可以正常工作。但是问题是,prog.pygenerator.py 导入为:

from generator import generate, languages

运行测试时,出现错误:ImportError: No module named generator
我做了一些窥探,发现sys.path[0]在我执行第二个文件时没有更新。

我的问题是,有没有办法在执行另一个文件时获取更新路径,或者有更好的方法来简单地获取正在执行的模块的位置?

我的代码如下:

test.py

import os
import unittest2

import tests # Self reference for working directory.
relative_dir = os.path.dirname(tests.__file__)

class Test(unittest2.TestCase):
    def test_program(self):
        msg('Attempting to generate example utility.') # just prints the message, nothing interesting
        variables = {'help': '-h'} # command line variables
        execfile(relative_dir + "/../src/prog.py", variables)

prog.py

import os

import prog # This file.
relative_dir = os.path.dirname(dash_h.__file__)

我不会费心显示generator.py,因为这已经足够完整了。无论生成器如何,即使只是简单地从自身导入 prog 也会引发完全相同的错误。

ImportError: No module named prog

我正在终端中从父目录执行以下命令:

python -B test/test.py

如果后者存在,我实际上希望将其合并到我拥有的所有其他文件中。

【问题讨论】:

  • 你来这里的目的是什么?你到底想完成什么?
  • @Code-Apprentice 我正在使用unittest2 来测试另一个文件夹中的文件。但我不想简单地运行一个函数,我想用参数执行它,就好像它是从命令行执行一样。
  • 如果从同一个目录执行同样的命令,是否有效?
  • @finnrayment 请提供一个最小的完整示例。这不应该是您的整个代码。事实上,在这种情况下,你应该只是编造一个非常人为的例子来展示你想要完成的事情。
  • @finnrayment 请再次阅读我之前的评论并查看帮助部分以获取有关创建 MCVE 的提示。

标签: python path python-import


【解决方案1】:

我的建议是将输入文件的路径作为命令行参数传递。

【讨论】:

  • 嗯....这就是问题所在。我不能依赖 tests.py 来解析它的参数,因为 每个 参数必须在程序执行时解析。
  • @finnrayment tests.py 不应接受任何要解析的参数。正在测试的应用是否已经需要其他参数?
  • 没错。 tests.py 直接运行。该应用程序本身是一个命令行实用程序,它会循环接收收到的所有参数。我想通过为其提供要解析的数据来测试此功能。这就是为什么我无法解析到它的路径,因为按照设计,它会尝试使路径变得有意义,并最终将其存储在我不想要的变量中。跨度>
猜你喜欢
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
  • 2015-04-10
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 2013-06-17
  • 1970-01-01
相关资源
最近更新 更多