0

我遇到了一个奇怪的问题,我不太确定如何解决。我有一个 Python-selenium 脚本,它使用相对路径将结果记录到文本文件中。

这是设置日志文件的脚本部分:

log_file = './demo-logfiles/log_file_template.txt'
sys.stdout = open('log_file_template.txt', 'a',)

如您所见,它使用文件夹的相对路径。如果我将此脚本运行为: python demo.py firefox MAC,它将完美运行,并且日志文件将被发送到正确的文件夹。

如果我从一个更大的 shell 脚本中运行这个确切的 Python 脚本,它会返回一个'./demo-logfiles/log_file_template.txt'不存在的错误。

我发现如果我将脚本更改为'../demo-logfiles/log_file_template.txt'它可以在更大的 shell 脚本中工作,但如果我正常运行它就会停止工作。

它要么在一个中工作,要么在另一个中工作。以不同方式解释相对目录的原因是什么?我不想让两个单独的脚本在 Python/shell 中运行。

原始的python脚本在目录/blah/blah/DEMO/demo.py中,运行它的shell脚本在/blah/blah/DEMO/demo-autotest/autotest_logger.sh

我已确认我尝试运行的任何脚本都会出现此问题。我不必更改原始 Python 代码以使其与 shell 脚本一起使用。我已经在 shell 脚本中解释了它,它成功地运行了该文件。

谢谢。

4

2 回答 2

3

你永远不应该使用“。” (或任何相对路径)在脚本的目录路径中,除非您真的要引用用户从中运行脚本的目录。如果要引用相对于正在运行的脚本的位置,可以执行以下操作:

import os
import sys
directory = os.path.dirname(os.path.abspath(__file__))
sys.stdout = open(os.path.join(directory, "demo-logfiles", "log_file_template.txt"), "a")

最佳实践附注:您可能应该使用logging模块而不是重新分配sys.stdout.

于 2013-01-23T15:34:49.907 回答
2

术语“相对目录”意味着路径是相对于某物的。您可能认为它与包含路径的脚本相关,但这是不正确的。

相对路径相对于解释脚本的进程的当前目录,即您启动的文件夹python。如果你在 shell 中,你可以看到当前目录echo $PWD

如果您从 开始python/blah/blah那么它将成为当前目录,并且所有相对路径都相对于/blah/blah.

请参阅David Hollman 的答案,了解如何获取当前脚本的路径以及如何构建相对于该脚本的路径。

于 2013-01-23T15:41:05.953 回答