首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyRal getAttachment

PyRal getAttachment
EN

Stack Overflow用户
提问于 2018-04-23 15:31:52
回答 2查看 630关注 0票数 2

我有一个相当简单的用例,但是我不理解我收到的错误信息。

我正在使用requests和pyral模块,pyral (http://pyral.readthedocs.io/en/latest/interface.html#)实际上只是Rally的Restful的包装器。我的目标是从Rally ( CA产品) UserStory获取一个文件(附件),并将其存储到本地文件系统中。

对于上下文,这里是我的环境设置(通过Rally身份验证并创建一个对象)。我显然删除了身份验证信息。

代码语言:javascript
复制
from pyral import Rally, rallyWorkset

options = [arg for arg in sys.argv[1:] if arg.startswith('--')]
args = [arg for arg in sys.argv[1:] if arg not in options]
server, user, password, apikey, workspace, project = rallyWorkset(options)
rally = Rally(server='rally1.rallydev.com', 
user='**********', password='***********', 
          apikey="**************",
          workspace='**************', project='**************',
          server_ping=False)

在此之后,我只获得一个用户故事的响应对象(请参阅US845的查询),我这样做只是为了简化问题。

代码语言:javascript
复制
r = rally.get('UserStory', fetch = True, projectScopeDown=True, query = 'FormattedID = US845')

然后,我使用内置迭代器从RallyRESTResponse对象获取用户故事。

代码语言:javascript
复制
us = r.next()

从这里看,我应该能够轻松地使用接受工件(us)和文件名(附件名称)的getAttachment()方法。我可以使用getAttachmentNames(us)返回附件名称的列表。当我尝试这样的事情时,问题就出现了。

代码语言:javascript
复制
attachment_names = rally.getAttachmentNames(us) #get attachments for this UserStory
attachment_file = rally.getAttachment(us, attachment_names[0]) #Try to get the first attachment 

返回如下错误

代码语言:javascript
复制
Traceback (most recent call last):

File "<ipython-input-81-a4a342a59c5a>", line 1, in <module>
attachment_file = rally.getAttachment(us, attachment_names[0])

File "C:\Miniconda3\lib\site-packages\pyral\restapi.py", line 1700, in getAttachment
att.Content = base64.decodebytes(att_content.Content)  # maybe further txfm to Unicode ?

File "C:\Miniconda3\lib\base64.py", line 552, in decodebytes
_input_type_check(s)

File "C:\Miniconda3\lib\base64.py", line 520, in _input_type_check
raise TypeError(msg) from err

TypeError: expected bytes-like object, not str

如果我尝试使用

代码语言:javascript
复制
test_obj = rally.getAttachments(us)

返回如下错误:

代码语言:javascript
复制
Traceback (most recent call last):

File "<ipython-input-82-06a8cd525177>", line 1, in <module>
rally.getAttachments(us)

File "C:\Miniconda3\lib\site-packages\pyral\restapi.py", line 1721, in getAttachments
attachments = [self.getAttachment(artifact, attachment_name) for attachment_name in attachment_names]

File "C:\Miniconda3\lib\site-packages\pyral\restapi.py", line 1721, in <listcomp>
attachments = [self.getAttachment(artifact, attachment_name) for attachment_name in attachment_names]

File "C:\Miniconda3\lib\site-packages\pyral\restapi.py", line 1700, in getAttachment
att.Content = base64.decodebytes(att_content.Content)  # maybe further txfm to Unicode ?

File "C:\Miniconda3\lib\base64.py", line 552, in decodebytes
_input_type_check(s)

File "C:\Miniconda3\lib\base64.py", line 520, in _input_type_check
raise TypeError(msg) from err

TypeError: expected bytes-like object, not str

似乎我从根本上误解了这个方法所需的参数?以前有人能成功地做到这一点吗?值得注意的是,我在使用与上面类似的工作流的addAttachment()方法时没有问题。我尝试过用字节()方法将文件名(string)转换为utf-8,但这没有帮助。

我还在pyral源代码中查看了这个示例,但是在尝试执行这个示例时,我收到了完全相同的错误。

attachments.py

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-23 19:46:58

它看起来像restapi.py脚本中的问题--在base64库中没有任何解码方法:

代码语言:javascript
复制
att.Content = base64.decodebytes(att_content.Content)

所有可用的方法都在:RFC 3548: Base16,Base32,Base64数据编码中描述,因此,解决方法是用base64.b64decode代替restapi.py中的解码器。至少它对我有用。

例如,Mac的位置:

代码语言:javascript
复制
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pyral/restapi.py
票数 2
EN

Stack Overflow用户

发布于 2020-04-02 14:17:02

我使用了下面的代码来获取所有附件,因为getAttachments不像预期的那样工作。它将使用相同的名称在当前dir中创建一个文件。

代码语言:javascript
复制
import sys
import string
import base64
from pyral import rallyWorkset, Rally,RallyRESTResponse

rally = Rally(server, user=USER_NAME, password=PASSWORD, workspace=workspace, project=project)
criterion = 'FormattedID = US57844'
response = rally.get('HierarchicalRequirement',  query=criterion, order="FormattedID",pagesize=200, limit=400, projectScopeDown=True)

artifact = response.next()
context, augments = rally.contextHelper.identifyContext()
for att in artifact.Attachments:
    resp = rally._getResourceByOID(context, 'AttachmentContent', att.Content.oid, project=None)
    if resp.status_code not in [200, 201, 202]:
        break
    res = RallyRESTResponse(rally.session, context, "AttachmentContent.x", resp, "full", 1)
    if res.errors or res.resultCount != 1:
        print("breaking the for loop")
    att_content = res.next()
    cont = att_content.Content
    x = base64.b64decode(cont)
    output = open(att.Name, 'wb') 
    output.write(x)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49984802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档