【问题标题】:printing to console in Python while working with 3rd party modules在使用 3rd 方模块时在 Python 中打印到控制台
【发布时间】:2017-10-26 20:57:27
【问题描述】:

我正在使用第三方模块,并且在调用这些模块时遇到了错误。 这是编译器显示的内容:

C:\Users\Dmitry\AppData\Local\Enthought\Canopy\edm\envs\User\lib\site-    packages\backtrader\feeds\csvgeneric.py in _loadline(self, linetokens)
    148                 # get it from the token
    149                 csvfield = linetokens[csvidx]
--> 150                 print(csvidx)
    151 
    152             if csvfield == '':
IndexError: list index out of range

我特意添加了 print(csvidx) 来查看 csvidx 的值,但它没有显示在控制台上。我究竟做错了什么?非常感谢。

代码如下:

  def _loadline(self, linetokens):
        # Datetime needs special treatment
        dtfield = linetokens[self.p.datetime]
        if self._dtstr:
            dtformat = self.p.dtformat

            if self.p.time >= 0:
                # add time value and format if it's in a separate field
                dtfield += 'T' + linetokens[self.p.time]
                dtformat += 'T' + self.p.tmformat

            dt = datetime.strptime(dtfield, dtformat)
        else:
            dt = self._dtconvert(dtfield)

        if self.p.timeframe >= TimeFrame.Days:
            # check if the expected end of session is larger than parsed
            if self._tzinput:
                dtin = self._tzinput.localize(dt)  # pytz compatible-ized
            else:
                dtin = dt

            dtnum = date2num(dtin)  # utc'ize

            dteos = datetime.combine(dt.date(), self.p.sessionend)
            dteosnum = self.date2num(dteos)  # utc'ize

            if dteosnum > dtnum:
                self.lines.datetime[0] = dteosnum
            else:
                # Avoid reconversion if already converted dtin == dt
                self.l.datetime[0] = date2num(dt) if self._tzinput else dtnum
        else:
            self.lines.datetime[0] = date2num(dt)

        # The rest of the fields can be done with the same procedure
        for linefield in (x for x in self.getlinealiases() if x != 'datetime'):
            # Get the index created from the passed params
            csvidx = getattr(self.params, linefield)

            if csvidx is None or csvidx < 0:
                # the field will not be present, assignt the "nullvalue"
                csvfield = self.p.nullvalue
            else:
                # get it from the token
                print(csvidx)
                csvfield = linetokens[csvidx]


            if csvfield == '':
                # if empty ... assign the "nullvalue"
                csvfield = self.p.nullvalue

            # get the corresponding line reference and set the value
            line = getattr(self.lines, linefield)
            line[0] = float(float(csvfield))

        return True

【问题讨论】:

  • 在定义csvfield之前尝试print(csvidx)
  • 法比恩,感谢您对我的照顾。但不,同样的结果。 C:\Users\Dmitry\AppData\Local\Enthought\Canopy\edm\envs\User\lib\site-packages\backtrader\feeds\csvgeneric.py in _loadline(self, linetokens) 147 else: 148 # get it from the token --&gt; 149 print(csvidx) 150 csvfield = linetokens[csvidx] 151 IndexError: list index out of range .
  • 那你能显示以这个错误结尾的代码吗?看看csvfiledlinetokenscsvidx 是什么(以及它们是如何定义的)会有所帮助。
  • 这确实是像pdb 这样的调试器的用途。我经常发现remote_pdb 在应用程序干扰控制台输出的情况下很有用。

标签: python printing


【解决方案1】:
        csvidx = getattr(self.params, linefield)

        if csvidx is None or csvidx < 0:
            # the field will not be present, assignt the "nullvalue"
            csvfield = self.p.nullvalue
        else:
            # get it from the token
            print(csvidx)
            csvfield = linetokens[csvidx]

csvidx 正在self.params 中寻找,显然已经找到了。

而且它似乎既不是None也不是&lt; 0,所以它似乎有一个数值&gt;= 0

IndexError: list index out of range 清楚地表明linetokens 包含的项目不如csvidxexpects 那么多。

由于名称self.params 似乎表示用户输入,因此您给出的任何值似乎都大于linetokens 中可用令牌的实际数量

代码似乎是在其中一个罐装 Python 环境中执行的

--> 150                 print(csvidx)

因为这肯定不是通常的 Python 控制台输出。如果那个罐装环境(而不是第 3 方包)真的允许您在控制台上 print,那么实际上早点这样做似乎是可取的,如下所示:

    for linefield in (x for x in self.getlinealiases() if x != 'datetime'):
        # Get the index created from the passed params
        csvidx = getattr(self.params, linefield)
        print('linefield {} -> csvidx {}'.format(linefield, csvidx)

        if csvidx is None or csvidx < 0:
            # the field will not be present, assignt the "nullvalue"
            csvfield = self.p.nullvalue
        else:
            # get it from the token
            csvfield = linetokens[csvidx]

在触发异常之前,您应该会看到每个关系 linefield -> csvidx

如果您的环境允许,请使用python -u 运行所有内容,该python -u 使用无缓冲 输出。 (强烈建议在已知换行符上刷新不起作用或有问题的 Windows 下)

【讨论】:

  • 非常感谢您的意见。不幸的是,您的 print() 方法也不起作用。似乎控制台受到此应用程序的某种影响。它是罐装环境(Canopy),但切换到原始环境对我来说并没有改变=(无论如何非常感谢您提供如此详细的答案。
  • 在 Canopy 下运行时,您可以找到邀请开发人员手动刷新输出的消息。见:stackoverflow.com/questions/18709659/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-20
  • 1970-01-01
  • 2013-01-27
  • 1970-01-01
  • 2013-03-09
相关资源
最近更新 更多