我很难找到解决这个问题的办法。我使用的绝对路径绝对存在于文件系统中。在同一个脚本中使用相同的精确路径时,
if host.file(logPath).exists:
print("Exists: " + logPath)我得到了
Exists: /var/opt/jws/jws3.0/v7/testinfra_node1/logs/catalina.out但在尝试时:
with open(logPath, "rt") as log:我得到了:
> with open(logPath, "rt") as log:
E IOError: [Errno 2] No such file or directory: '/var/opt/jws/jws3.0/v7/testinfra_node1/logs/catalina.out'下面是整个代码(这是一个用于测试JWT安装的testinfra脚本):
import pytest
import testinfra
import time
import os
@pytest.mark.parametrize("jws_version", [("3.0")])
def test_server_recycle(host, jws_version):
instances = host.check_output("cat /var/opt/jws/jws" + jws_version + "/init/init_instances | grep -oP '(\/.*?\/)((?:[^\/]|\\\\/)+?)(?:(?<!\\\\)\s|$)'")
last = ""
for last in iter(instances.splitlines()):
pass
last = last.strip().encode('ascii','ignore')
print(last)
instanceName = ""
for instanceName in iter(last.split("/")):
pass
print(instanceName)
binPath = last + "/bin/"
logDir = last + "/logs/"
logPath = os.path.join(logDir, "catalina.out")
print(logPath)
runningAt0 = isInstanceRunning(host, instanceName)
if host.file(logPath).exists:
print("Exists: " + logPath)
if (runningAt0):
with host.sudo():
host.run(os.path.join(binPath, "shutdown.sh"))
with open(logPath, "rt") as log:
result = waitForEntry(log, "INFO org.apache.catalina.core.StandardService- Stopping service Catalina","ERROR")
assert not result.eq("ERROR")
assert not isInstanceRunning(host, instanceName)
host.run(os.path.join(binPath, "/bin/startup.sh"))
with open(logPath, "rt") as log:
result = waitForEntry(log, "INFO org.apache.catalina.startup.Catalina- Server startup in","ERROR")
assert not result.eq("ERROR")
assert isInstanceRunning(host, instanceName)
else:
with host.sudo():
host.run(os.path.join(binPath, "startup.sh"))
with open(logPath, "rt") as log:
result = waitForEntry(log, "INFO org.apache.catalina.core.StandardService- Stopping service Catalina","ERROR")
assert not result.eq("ERROR")
assert isInstanceRunning(host, instanceName)
host.run(os.path.join(binPath, "shutdown.sh"))
with open(logPath, "rt") as log:
result = waitForEntry(log, "INFO org.apache.catalina.startup.Catalina- Server startup in","ERROR")
assert not result.eq("ERROR")
assert not isInstanceRunning(host, instanceName)
def isInstanceRunning(host, instanceName):
processes = host.check_output("ps auwwx | grep catalina.startup.Bootstrap")
if "-Dtomcat.inst.name=" + instanceName in processes:
return True
else:
return False
def waitForEntry(file, entry1, entry2):
while 1:
file.seek(0,2)
line = file.readline()
if entry1 in line:
return entry1
else:
if entry2 in line:
return entry2
else:
time.sleep(0.1)而不是
host.file(logPath).exists我也一直在努力
print(host.check_output("cat " + logPath))它很好地打印了文件内容。
对如何处理这件事有什么想法吗?事先非常感谢!
编辑:下面是我执行脚本的方式:
py.test -v -host=user@host tomcat_test_recycle.py --sudo
发布于 2019-02-05 11:10:14
testinfra包似乎将测试远程服务器的状态集成到pytest中。因此
host.file(logPath).exists和
host.check_output("cat " + logPath)正在检查远程服务器上的存在和内容,而
open(logPath, "rb") 在本地机器上运行。文件不在本地机器上,而是在host上。
https://stackoverflow.com/questions/54523058
复制相似问题