【问题标题】:How does Python (or MonkeyRunner) locate imported modules?Python(或 MonkeyRunner)如何定位导入的模块?
【发布时间】:2023-04-08 10:39:01
【问题描述】:

更新:根据@dtmilano 的建议,我添加了

import sys
print(sys.path)

到我的 MonkeyRunner 脚本的开头。这导致

['e:/path/android-sdk/tools/lib/monkeyrunner.jar:e:\\path\\bbct\\android\\functional-tests', 'E:\\path\\android-sdk\\tools\\lib\\Lib', '/E:/path/android-sdk/tools/lib/jython-standalone-2.5.3.jar/Lib', '__classpath__', '__pyclasspath__/']

乍一看,我认为这包括当前工作目录。然而,仔细检查表明输出是一个字符串列表,其中第一个字符串是

'e:/path/android-sdk/tools/lib/monkeyrunner.jar:e:\\path\\bbct\\android\\functional-tests'

由于某种原因,它包含连接在一起的两条路径。这是 MonekyRunner 和/或 Jython 中的错误吗?

原问题:我在同一个目录中有两个 .py 文件:screenshots.pyutil.py。我需要使用 Android 构建工具中的 monkeyrunner 解释器运行 screenshots.py。当我运行monkeyrunner screenshots.py 时,我收到错误No module named util。如何配置我的 python 和/或 monkeyrunner 以在 util.py 中查找代码?

编辑: 我在 Win7 上使用 Git Bash。 (哎呀,我可能应该早点提到这一点。)

作为参考,这是完整的错误信息:

130807 12:01:59.978:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] 脚本因异常而终止
130807 12:01:59.978:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions]Traceback(最近一次通话):
文件“c:\Users\Dell\Documents\dev\src\java\bbct\android\functional-tests\screenshots.py”,第 19 行,在
导入实用程序
ImportError: 没有名为 util 的模块

130807 12:01:59.978:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions]
在 org.python.core.Py.ImportError(Py.java:264)
130807 12:01:59.978:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions]
在 org.python.core.imp.import_first(imp.java:657) 130807 12:01:59.978:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions]
在 org.python.core.imp.import_name(imp.java:741) 130807 12:01:59.978:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions]
在 org.python.core.imp.importName(imp.java:791) 130807 12:01:59.978:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions]
在 org.python.core.ImportFunction.call(_builtin_.java:1236) 130807 12:01:59.978:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions]
在 org.python.core.PyObject.调用(PyObject.java:367) 130807 12:01:59.978:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions]
在 org.python.core.builtin._import_(builtin.java:1207) 130807 12:01:59.978:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions]
在 org.python.core.builtin._import_(builtin.java:1190) 130807 12:01:59.978:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions]
在 org.python.core.imp.importOne(imp.java:802) 130807 12:01:59.978:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions]
在 org.python.pycode._pyx0.f$0(c:\Users\Dell\Documents\dev\src\java\bbct\android\functional-tests\screenshots.py:51) 130807 12:01:59.978:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions]
在 org.python.pycode._pyx0.call_function(c:\Users\Dell\Documents\dev\src\java\bbct\android\functional-tests\screenshots.py) 130807 12:01:59.978:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions]
在 org.python.core.PyTableCode.call(PyTableCode.java:165) 130807 12:01:59.978:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions]
在 org.python.core.PyCode.call(PyCode.java:18) 130807 12:01:59.978:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions]
在 org.python.core.Py.runCode(Py.java:1197) 130807 12:01:59.978:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions]
在 org.python.core.builtin.execfile_flags(builtin.java:538) 130807 12:01:59.978:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions]
在 org.python.util.PythonInterpreter.execfile(PythonInterpreter.java:156) 130807 12:01:59.978:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions]
在 com.android.monkeyrunner.ScriptRunner.run(ScriptRunner.java:116) 130807 12:01:59.978:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions]
在 com.android.monkeyrunner.MonkeyRunnerStarter.run(MonkeyRunnerStarter.java:77) 130807 12:01:59.978:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions]
在 com.android.monkeyrunner.MonkeyRunnerStarter.main(MonkeyRunnerStarter.java:189)

【问题讨论】:

标签: android python module monkeyrunner


【解决方案1】:

供您参考,android SDK 似乎确实存在一个错误,其中 sys.path 上的第一项是 monkeyRunner 库和工作目录混合在一起。我添加了以下内容进行修复。

import sys
sys.path.append(sys.path[0].split(':',1)[1])
import util

【讨论】:

    【解决方案2】:

    需要将模块添加到搜索路径(你cwd不在同一个目录下?)

    http://docs.python.org/2/tutorial/modules.html

    导入系统 sys.path.append('/path/to/your/module')

    【讨论】:

    • 是的,cwd 是包含两个 .py 文件的目录。
    • 特别是 6.1.2 The Module Search Path 回答了我的 Q 标题中的问题。不幸的是,它并没有完全回答基本问题,即如何解决问题。我会尽快调查。
    【解决方案3】:

    脚本所在的目录由monkeyrunner 自动添加到sys.path(这对其他操作系统非常有效,不幸的是,您似乎正在使用它没有使用的操作系统)。 然后可以毫无问题地导入脚本同一目录中存在的其他模块。

    也就是说,screenshots.py 应该找到utils.py,因为目录functional-testssys.path 中。

    您可以通过以下方式验证其内容

    import sys
    print sys.path
    import util
    

    screenshots.py。我的猜测是所有c:\ 都在搞乱路径。

    【讨论】:

    • 这是有道理的,因为这适用于我的 Debian Linux 机器,但不适用于使用 Git Bash(基本上是 mingw)的 Win7 机器。
    • 添加您在此处建议的代码后,我看到我的 CWD 在sys.path。任何想法为什么我在 Win7 下从 Git Bash 运行时仍然收到“No module named util”错误?
    • 我用print sys.path 的实际输出更新了我的Q。毕竟它不包含 CWD。它与另一条路径相连。任何想法为什么以及如何解决它?
    • 可能你必须明确地包含目录
    猜你喜欢
    • 1970-01-01
    • 2012-02-21
    • 2018-05-16
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-13
    相关资源
    最近更新 更多