a #eq@s<ddlZddlZddlZddlZddZddZddZdS)Nc Csltj|rht|dB}ttddttj| d}dd|DWdS1s^0YgS)z~ Parse a requirements.txt file :param requirements_file: path to requirements.txt file :return: package names rcSs t|dkS)Nr)len)xr/webodm/app/plugins/pyutils.pyz$parse_requirements.. cSsg|]}td|dqS)z ==|<=|>=|<|>r)resplit).0drrr rz&parse_requirements..N) ospathexistsopenlistfiltermapstrstripreadr )requirements_filefdepsrrrparse_requirementss   $,rcCsftj}|ddd||d<tjgd|d}dd|D}t|}t|t|@t|kS)al Checks if the packages in requirements.txt have been installed in the specified python path. Note that this does NOT check for versions, just package names :param requirements_file: path to requirements.txt :param python_path: path to directory where packages are installed :return: True if all requirements are installed, false otherwise Z PYTHONPATH:)pythonz-mpipfreeze)envcSsg|]}|ddqS)z==r)decoder )r rrrrrrz*requirements_installed..) renvironcopyget subprocess check_outputr rset)rZ python_pathr"reqsZinstalled_packagesrrrrrequirements_installeds  r+cCstt|dS)Nrb)hashlibmd5rr hexdigest)filenamerrrcompute_file_md5$sr1)rr r'r-rr+r1rrrrs