【问题标题】:Python script doesnt work in differents virtual machinesPython 脚本在不同的虚拟机中不起作用
【发布时间】:2019-09-27 04:32:29
【问题描述】:

我有一个脚本可以清除确定路径中的日志。

这个脚本在一个虚拟机上工作,但是当我导出到另一个虚拟机时,这个脚本不起作用。 python的版本是一样的:

[ec2-user@host1 h]$ python3 --version
Python 3.5.1

错误:

Traceback (most recent call last):
  File "jenk.py", line 54, in <module>
    dicta = dict(path)
  File "jenk.py", line 51, in dict
    dicto[elem] = { (dirs['Subdir'][elem]['Path']) : (dirs['Subdir'][elem]['Num_Subdir']) }
KeyError: 'Path'

这是代码:

def PathToDict(path):
    st = os.lstat(path)
    result = {}
    if S_ISDIR(st.st_mode):
        result['Path'] = path
        result['Subdir'] = {
            name: PathToDict(path+'/'+name)
            for name in os.listdir(path)}
        result['Num_Subdir'] = int(len([i for i, j, k in os.walk(path)]))
#        result['RealSize'] = subprocess.check_output(['du','-sh', path]).split()[0].decode('utf-8')

    else:
        result['type'] = 'file'
    return result

dirs = PathToDict(path)


#Getting new dict with clean info with name of dir and number of dirs

def dict(path):

    dicto = {}
    for elem in dirs['Subdir']:
        dicto[elem] = { (dirs['Subdir'][elem]['Path']) : (dirs['Subdir'][elem]['Num_Subdir']) }
    return dicto

有什么想法吗?可能是模块的问题?

【问题讨论】:

  • 你是如何定义 S_ISDIR 方法的?
  • stat.S_ISDIR(mode) 如果模式来自目录,则返回非零值。

标签: python python-3.5


【解决方案1】:

可能使东西依赖于操作系统的一件事是您手动加入文件路径

 name: PathToDict(path+'/'+name)

但是,“/”可能并非在所有设备上都有效。相反,最好在 python 中使用os.path 模块来连接路径。这将自动选择正确的分隔符。

name: PathToDict(os.path.join(path,name))

这至少会使那部分代码独立于平台。

此外,通过os.path.normpath 传递您的输入将确保输入正确解析为您的平台上可读的内容。

【讨论】:

  • '/' 应该在所有设备中都有效,因为它们是相同的 SO 并且路径完全相同。我不明白。可能是 Python 的模块版本或类似问题?
  • 啊抱歉,当你说不同的虚拟机时,我还假设它们运行在不同的操作系统上。
【解决方案2】:

elem 中没有“路径”。

尝试调试

print(dirs['Subdir'][elem])

或使用

dirs['Subdir'][elem].get('Path')

【讨论】:

  • 但我的问题是为什么一台主机中没有路径,而另一台主机中没有路径..我会尝试这个调试..
  • 调试输出中有Path {'Path': '/var/lib/jenkins/jobs/postgresql-backup-recovery/builds/330', 'Num_Subdir': 1, 'Subdir': {'log': {'type': 'file'}, 'build.xml': {'type': 'file'}, 'changelog.xml': {'type': 'file'},
  • 我检查了 Path 存在,但不是子元素。两台机器的输出都不同,但我知道为什么..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
  • 2021-11-08
  • 2016-11-01
  • 2013-01-28
  • 1970-01-01
  • 2021-05-03
  • 2013-07-29
相关资源
最近更新 更多