Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过http GET和gitlab api创建YAML文件_Python_Python 3.x_Http_Yaml_Gitlab - Fatal编程技术网

Python 通过http GET和gitlab api创建YAML文件

Python 通过http GET和gitlab api创建YAML文件,python,python-3.x,http,yaml,gitlab,Python,Python 3.x,Http,Yaml,Gitlab,所以我尝试使用gitlab api来提取我的CI作业工件文件。这是URL: https://WEBURL/api/v4/projects/923/jobs/artifacts/master/download?job=Bundle Review 如果我通过浏览器运行它,它会立即下载文件并将其放入我的下载文件夹。现在,我想通过一个python脚本来实现这一点,并解析YAML中的特定数据 artifactsURL = "https://WEBURL/api/v4/projects/" + str(p

所以我尝试使用gitlab api来提取我的CI作业工件文件。这是URL:

https://WEBURL/api/v4/projects/923/jobs/artifacts/master/download?job=Bundle Review
如果我通过浏览器运行它,它会立即下载文件并将其放入我的下载文件夹。现在,我想通过一个python脚本来实现这一点,并解析YAML中的特定数据

artifactsURL = "https://WEBURL/api/v4/projects/" + str(projectID) + "/jobs/artifacts/master/download?job=Bundle Review"
header = {'PRIVATE-TOKEN': 'TOKENNUM'}
artifacts = requests.get(artifactsURL, headers=header)
print(artifacts.content)
现在我得到了这样的回答:

PK\x03\x04\x14\x00\x08\x00\x08\x00\x98%\x9cJ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x18\x00fscm.ymlux\x0b\x00\x01\x04\x00\x00\x00\x00\x04\x00\x00\x00\x00UT\x05\x00\x01\xc1\xc8\x02Y\xecX\xdds\xe28\x12\x7f\xcf_\xa1\xb7T]\xc5\x1f|-DWT\x1d\x93\x90Ln3\x812$\xb7\xfb\xe4\x12rc4\xd8\x92K\x92I\xd8e\xff\xf7+\x7fb\xc0L\xc8&W\xb73wy\xa0"u\xb7\xba\xfb\xd7_\x929\xe8g!\x97\n\x9f!D\x05_\x81d\n\xa3\xdf\xff8Ch.\x05\xd7\xc5\xff1\xa7\x9a\t^\xd0\x94\x96@B\xc6\xfd|\xad%\x819[\xba2T\x86\x07\xab\xe44\x84\xe0E\x83\xe4$\xc0H\xcb\x18\xce\x14\xc8\x15\xa3\x90\xaa"\x113$\x10/c\xf4 \x02\xee)W\xf0lm\x94\xa6\x18\xde,\xdda!\xf1\x01#O\xd0%H3\xa6$\xf0\x89\\\x9b\x94X\x89F\xc6\xb5U\x9e\x18\x12\xa5A\xa6RU\xe7\x92\xbf\xad\x83<\x0e\x82\xc4c\xdf\xc8<\xc98\xa8\x08C\xc2\xbd\xc2\x08\xc3\xf0\xa5\x88\xa3\xc2\xa4\x82\xb7X/\x04\xa3P\xe5\xa8\x90=\x88\x02\xb1.\xf4JP"\x96\xb9\xeb\xe5\x16\xc8\x15\xc90-w\x11\n!\x14r\x8dQ\xc3\xb6\xbfl\xa55\x91\xda\x8dD\xc0\xe8z\xcbL\x05\xf7Xr\x00F\x82\x1bs\xc2\x82XBI\xf5  k\x8c\x9a\xb6:\x01@\xe5EV\ty\x8e\xc87p\xacD?\x07\xb2\xb4r\xcf\x96\x12\xf1\x13\xe3\xfcn\xdc\x9a\x9d\x028\xe0+&\x05\x0f\x81\xeb\x82\xf1j\xf4\xf04t\xee&\xee\xe7\xd1d\x8a\xd1\\\xd1\xd0\xc8\xdc4\xf3\xc4\xad"S\x089\x837\xf1\xdf\xde\xb8W\xcep0\x1d\xba\xff|\xfa\xe2\x8e\xc6\xd3\xbb\xd1\xc3\x04#\xe3:V M\xcdB\xf8Mp\xe8\x0fB\x90\x8c\x12k\xe8\x85\x82k\xc1_\x89\x92\x96e\x80p\xc7l\xd8f\xeb\xb4\x0cO\xfe\xf2B.r~\x0b9\xfe\x18\xcc?\x1e\xf2B\xe8q|\xeb\x0c\xae\x87\xee\xf5`:\xf84\x98\x0c\'\x18\x9d7\xce\xffT`\xbeY\x00V\x05\x14\x83\n>g\xbez[#)\xe4\x9f\xa1\x16\xd5\x80\xcc \xa8\x80\x97\xf7K37\'?\x1f\xef\xf7\xd1\x03\xfe4\x94\xc0=\x13\xb8\x96\xeb\xb1`\\+\x8c\x16ZG\x17\xc9\x8f:. \xe3\x000\xfa,\x94\xc6\xaf\xc0\xf5\xf71\xd1\x8b\xb1\x849{\xc1%0\x07\x07G")\xf6\xf3v\xbbu~H\x93B\x0b*\x82\xcc\xb2CYM|\x85Q\xd5\xc7\xba\xcc\x19L\xdc\xfb\xd1\xed\xdd\x83\xfb\xe8\xdc\xe7\'a\xcb\xa2D\xedD\x8f\x12e\x05\xc2g\xbc"\xf64\xb8\xbf\xbbN*\xf0U\xc9\x982/\x9fKO$`\x1e\xd1\xf0\xae\xc4\xfd\xa0\x94\xacT{\x9aQ\r\xb3a6j3q\xb7\xb6+ \x97\xa3\xb8\xa0y3\xc3#\x9a\x18\xf0\x92\x84\x0e\xe4\x91\xe2\x7f\xff\xa8\xa9\x89\xe5\xa7\xd1tz?\xbcv\xff5\x98\x0e\x1dw\xf4\xe0\x0e\x1dg\xe4`\x04/L\xd7\xb38\xd7C\xc7\xfd\xf4+F\x89\xcdb\xf6\x15\xa8V}\xe6]$K\xe0\x9a\xe9u\xb2\n\x18_nWDk\xc9f\xb1\x86\x15\tbP\xee\x8cq"\xd7}\xf1\xccA\xd6\x91\x85\x08\x8e\x12\xa9\xbf:JK\xb2\xe4(\x91\xc7\xe1Q\x9a\xd2\xf2\xb85\x7fac\xebC\xf48\x1d?N\xdd\x9b\x91\xf3e0\xc5\xe8\xab\x12\xbc\x96o<\x9aLo\x9d\xa4u/\x84\xd2\xfdJ\xa7EI"\xf6;\xedV\x13y3NB(\x89(\x99\x95\xfdH(\xedKP\xb5\xc7N\xae>\x0f\xbf\x0c&\x18E\xf1,`\xb4\x9e\xe7~4\xcd2\x08^\xa2Z\x8e\xe9\xe0\xd3}bZ%\xcb6\xdb\x14\xdbl\xf3k\xb3\x0f\xcf\xdf\xea\xcf\x1b\x8d\xef\xae\xdc\xab\xd1\xc3\xcd\xdd-F!(E|H\x87\xbe\x88\xb5\x19\xaa~\xdb\xb6\xedoH\x8e\x9d\xe1\xcd\xdd/\xb8\x9c\'\xbb\xd7\xdf\xa2EX3\xa1u\x00\xde3I\xea8 \x1a\x94\xae\xed\x0e\xb5\xd7\x81\xd3oo\xde\xcc\x10z\x01\xf2{\xeb\x193\xa2 \x14\x1e\x04YHw\xfb\x86^G\xb0\xdb;\x8a\x9d2\xc4\x1e\xcc\x19Om\xcf*\xe0\xa2r\xd7O\x18+\xcb4\x1b\xfa\x95\x8d\x0b\xb5V\x1aB*\xb8\xd2\x84\xa7\xba\xd3\xe1\xdfO\x7f\x97\xb0\xbe\xd0\x10FI\xcc\xfa\xdf{a\xa5\xb9\xf1Ze\xed\xc5b\xb3\x1b\x88\xcdn\x1465!\xd8T\xc0\xdd\xec#\xbf\xd9E{\x93\x82\xbc)\x10\xfe_(\xd1\xf0\xf4\x17l\xc9[\xac\x89&ih\xf2\xf5\xff\xdf\xaf\x87\xf0\x8a7\xc0+\x0e\xe1\xcd\x92\xfe?\x83\xef\x0f\x01\xb0O4<\x93\xf5\xf7\xfef:8#\x7f\x1e\xf5\xec\x9e\xfd\xda\xfb\xe8\x80|\xf8<B(\n\x08\x85\xeaxL\xc3\xab\xb4$\xa9;\xe5\xa6\x81\xb8\xf0\xc0\x94"\x00\xd4\xef\xa3\x90p\xe2\xe7A\xca#\\~\xca\xb3\n\xecm\xb3s\xe4sB\xe5\xb3\xdf\t/\x0c\x84V"\x88\xc3"\x8d\rd\xad\x88\xb4d\xcc\xad<dJ\xd0%\xae\xdd\x94\xcfg\x08-\xc9|I\xcaL\xd8\xfbR\xf4\x9b\x10K\x80(\xf7%\x99x\xc9`\xc3\x99P\xd5\xbf\xb2\x03g\xc7\xd9f\xc36\x9b\xa6}b\x9e\xa6BF\x92\xab\xc7\x0c\xd9*|\xc5\xa8\xf4\x94\xe3\x96eJZo\xb6M\x8b\x88Qe\xc4,c\xac\xb99\xfd<\xb8\xf9y\xe0:\xc3\xc9\xd4\x1d;\xa3_~\xdd>\x83\xb1U\xd5\xdd\xb3{\xcd\\$\xe5\xc3\xe8\\\xcb\x18\xce\xab6\x07\x84{BD\xd6\xben\xdb\xec\x1d\xc9\x99\xba\xdaO\xaa\xa1\xcc\x8a\x9em\xdb8\xf9\xb14M\x92?\\&\xc5\x15I\xf1\xf5\xa8G\xf3H\n\nJ\xe1\ns\xd5\xca#_u\xb6\xa9\x9e\x08\xfdC-H\xb3\xf3\x13\xee\xc2\x1c\xbav\xab\xd7\xe8^6\x1a\x97\xbd\xb9\xddiwH\xc7\x86K\xf0\x1av\xe7\'\xe2u\xbd\xe6\xac=\xef\xb6/\xbb\x94\x92\xf9\xcc\xbb\xecv\x1aM\xb8l\xb4\xe6\xed\x86\xd7\xcd\xbc\xdemN\x85\xa2\x1d\x04O\x9a\xf4\x87\x15\x16.#\xea\x03\x07I\x82\x93\xf0(\xb9\x7fT@\x92`\x03\xd5\x86\x96\xcc\xf7A\xaa\xdaQ\xbc\xcf\xf4\xdf\x05\xe3\xb4>zX)\x912\xa8\x08\x02\xa0Z\xc8Z7sj\xba\xfa\x0bO\xcbH\xa95\xa7\xaf~\\\xcc\xd8\x0eN,g\xa7\xfd\x11\xb3s\xbf\xf9F\x7f\xf6\x02s|\xf0E\xcaH\x1fKj\x01\xf5a\xcb\xa9\x1fi\x8f\xa2\x0b\x08\x93F\xee3\xa5\xe5\xfa=\xd3j\xef\xa8Z+\xf7\xd5\xbden\x95z\xf1\x9e\xe2]\x83r\x95[\xee\x96\xd96\x1b\xa7)Y\x81TY\xbbi\x99\xf6\xf9Yq\x0fA\xbf\xffqv\xf6\xef\x00\x00\x00\xff\xffPK\x07\x08\xd7\x9aY\xef \x06\x00\x00\xe3\x1c\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x98%\x9cJ\xd7\x9aY\xef \x06\x00\x00\xe3\x1c\x00\x00\x08\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00fscm.ymlux\x0b\x00\x01\x04\x00\x00\x00\x00\x04\x00\x00\x00\x00UT\x05\x00\x01\xc1\xc8\x02YPK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x00N\x00\x00\x00n\x06\x00\x00\x00\x00

从GitLab下载工件会得到一个.zip文件-请参阅开头的注释,其中说明:

Starting with GitLab 8.4 and GitLab Runner 1.0, the artifacts archive format 
changed to ZIP, and it is now possible to browse its contents, with the added 
ability of downloading the files separately.
数据的开头是
PK
,这证实了这一点。如果你的浏览器没有给你一个zip文件,它可能会为你解压下载

有一个模块,要在python3中与bytestring一起使用,还需要使用
io
模块:

import io
import zipfile

# construct artifactsURL and header as you were
artifacts = requests.get(artifactsURL, headers=header)

zip_fh = zipfile.ZipFile(io.BytesIO(artifacts.content))
然后使用
zipfile
模块中的
extract
extractall
方法从文件归档中获取所需的数据

如果您想下载一个特定的文件,那么也会有关于该文件的说明,包括如何为该特定文件构建URL。

您可以尝试
print(artifacts.json)
sorry
print(artifacts.json())
import io
import zipfile

# construct artifactsURL and header as you were
artifacts = requests.get(artifactsURL, headers=header)

zip_fh = zipfile.ZipFile(io.BytesIO(artifacts.content))