0

どうやって取り組むのかよくわからないという奇妙な問題を経験しています。相対パスを使用して結果をテキストファイルに記録するPython-seleniumスクリプトがあります。

ログファイルを設定するスクリプトの部分は次のとおりです。

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

ご覧のとおり、フォルダへの相対パスを使用しています。このスクリプトを次 python demo.py firefox MACのように実行すると、スクリプトは問題なく実行され、ログファイルが適切なフォルダーに送信されます。

この正確なPythonスクリプトをより大きなシェルスクリプト内から実行すると、'./demo-logfiles/log_file_template.txt'が存在しないというエラーが返されます。

スクリプトを変更する'../demo-logfiles/log_file_template.txt'と、より大きなシェルスクリプトでは機能しますが、通常どおり実行すると機能しなくなることがわかりました。

どちらかで動作します。相対ディレクトリがさまざまな方法で解釈される理由は何ですか?Python/シェルで実行するための2つの別々のスクリプトは必要ありません。

元のPythonスクリプトはディレクトリ/blah/blah/DEMO/demo.pyにあり、それを実行するシェルスクリプトはにあります/blah/blah/DEMO/demo-autotest/autotest_logger.sh

この問題は、実行しようとしているすべてのスクリプトで発生することを確認しました。シェルスクリプトで動作させるために、元のPythonコードを変更する必要はありません。私はすでにシェルスクリプトでそれを説明しました、そしてそれはファイルを首尾よく実行します。

ありがとう。

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。シェルを使用している場合は、現在のディレクトリを次のように表示できます。echo $PWD

で開始pythonすると/blah/blah、それが現在のディレクトリになり、すべての相対パスはに相対パスになり/blah/blahます。

現在のスクリプトのパスを取得する方法と、それに関連するパスを作成する方法については、DavidHollmanの回答を参照してください。

于 2013-01-23T15:41:05.953 に答える