【问题标题】:Can't import sys or io无法导入 sys 或 io
【发布时间】:2020-11-20 11:16:54
【问题描述】:

我正在尝试导入 sys 和 io:

import sys
import io

但我收到以下错误:

Error while compiling (offending file last):
    File '/Users/username/worktest/index.py', line 11, at import of:
    File '/Users/username/worktest/env/lib/python3.7/site-packages/numpy/__init__.py', line 293, at import of:
    File '/Users/username/opt/anaconda3/lib/python3.7/os.py', line 1026, at import of:
    File 'io', line 95, namely:
    
    Import error, can't find any of:
        /Users/username/worktest/_io/_WindowsConsoleIO.py
        /Users/username/worktest/_io/_WindowsConsoleIO.js
        /Users/username/worktest/env/lib/python3.7/site-packages/transcrypt/modules/_io/_WindowsConsoleIO.py
        /Users/username/worktest/env/lib/python3.7/site-packages/transcrypt/modules/_io/_WindowsConsoleIO.js
        /Users/username/worktest/_io/_WindowsConsoleIO.py
        /Users/username/worktest/_io/_WindowsConsoleIO.js
        /Users/username/opt/anaconda3/lib/python3.7/_io/_WindowsConsoleIO.py
        /Users/username/opt/anaconda3/lib/python3.7/_io/_WindowsConsoleIO.js
        /Users/username/opt/anaconda3/lib/python3.7/lib-dynload/_io/_WindowsConsoleIO.py
        /Users/username/opt/anaconda3/lib/python3.7/lib-dynload/_io/_WindowsConsoleIO.js
        /Users/username/worktest/env/lib/python3.7/site-packages/_io/_WindowsConsoleIO.py
        /Users/username/worktest/env/lib/python3.7/site-packages/_io/_WindowsConsoleIO.js
        /Users/username/worktest/_io.py
        /Users/username/worktest/_io.js
        /Users/username/worktest/env/lib/python3.7/site-packages/transcrypt/modules/_io.py
        /Users/username/worktest/env/lib/python3.7/site-packages/transcrypt/modules/_io.js
        /Users/username/worktest/_io.py
        /Users/username/worktest/_io.js
        /Users/username/opt/anaconda3/lib/python3.7/_io.py
        /Users/username/opt/anaconda3/lib/python3.7/_io.js
        /Users/username/opt/anaconda3/lib/python3.7/lib-dynload/_io.py
        /Users/username/opt/anaconda3/lib/python3.7/lib-dynload/_io.js
        /Users/username/worktest/env/lib/python3.7/site-packages/_io.py
        /Users/username/worktest/env/lib/python3.7/site-packages/_io.js


    Aborted
    
????  ./index.py
Module build failed (from ./node_modules/transcrypt-loader/__target_es5__/index.js):
Error: Command failed: python3 -m transcrypt --nomin --map --verbose "index"
    at checkExecSyncError (child_process.js:630:11)
    at Object.execSync (child_process.js:666:15)
    at Object.main (/Users/username/worktest/node_modules/transcrypt-loader/__target_es5__/index.js:56:67)
Error: webpack returned an error. Try configuring `entry` in your webpack config relative to the current working directory, or setting `context = __dirname` in your webpack config.

我正在尝试使用 Transcrypt 和 Wrangler 让我的 Python 脚本在 Cloudflare 的 Workers 上运行,但是无法导入这些模块(pypi 上不存在)的问题阻止了我这样做。

在 pypi 中是否有任何替代方案可供我使用?如果没有,如何在我的路径中本地安装它们。

它们的实际用法如下:

old_stdout = sys.stdout # Memorize the default stdout stream
sys.stdout = buffer = io.StringIO()

for row in query_job:
    # Row values can be accessed by field name or index.
    print("col1={}, col2={}, col3={}".format(row[0], row[1], row[2]))

sys.stdout = old_stdout # Put the old stream back in place

out1 = buffer.getvalue() # Return a str containing the entire contents of the buffer.

用于收集 Google BigQuery 查询的输出。这最终成为我能找到的实际检索输出的最简单方法,但我也愿意改变它。

【问题讨论】:

  • 你真的需要它吗?如果您不显示它,您真的需要print() 吗?您可以将其直接保存在变量中 - out1 = "col1={}, col2={}, col3={}".format(row[0], row[1], row[2]) 或使用 +='\n 将所有文本保存在 out1
  • 你说得对,根本不需要打印。我前段时间写了这篇文章,阅读打印输出似乎是当时最快的解决方案。

标签: python google-bigquery transcrypt


【解决方案1】:

你使用非常非常奇怪的方法来创建字符串。

您不需要使用print() 将其作为字符串保存在变量中 - 所以您不需要io.String()


更流行的是将所有字符串保留在列表中,然后使用"\n" 加入它们

all_rows = []

for row in query_job:
    all_rows.append( "col1={}, col2={}, col3={}".format(row[0], row[1], row[2]) )

out1 = '\n'.join(all_rows)

可以写成列表推导式

all_rows = [ "col1={}, col2={}, col3={}".format(row[0], row[1], row[2]) for row in query_job ]

out1 = '\n'.join(all_rows)

不太流行的是直接使用带有+=\n的字符串

out1 = ""

for row in query_job:
     out1 += "col1={}, col2={}, col3={}".format(row[0], row[1], row[2])
     out1 += "\n"

您甚至可以将"\n" 直接放入"col1={}, col2={}, col3={}\n"

out1 = ""

for row in query_job:
     out1 += "col1={}, col2={}, col3={}\n".format(row[0], row[1], row[2])

顺便说一句:如果您在 row 中只有 3 个元素,那么您可以在 .format(*row) 中使用 *

out1 = ""

for row in query_job:
     out1 += "col1={}, col2={}, col3={}\n".format(*row)

或使用列表理解

all_rows = [ "col1={}, col2={}, col3={}".format(*row) for row in query_job ]

out1 = '\n'.join(all_rows)

甚至是一行

out1 = '\n'.join([ "col1={}, col2={}, col3={}".format(*row) for row in query_job ])

顺便说一句:

如果您必须将print() 与缓冲区(或文件处理程序)一起使用,那么您不必替换sys.stdout,但您可以使用print(..., file=buffer)

buffer = io.StringIO()

for row in query_job:
    print("col1={}, col2={}, col3={}".format(row[0], row[1], row[2]), file=buffer)

out1 = buffer.getvalue() # 

但我不知道它是否适用于Transcrypt(和Wrangler),因为Transcrypt 可能只有标准模块的一部分——只有可以转换为JavaScript 的模块。某些函数可能无法转换,因为 JavaScript 无权访问您的磁盘(出于安全原因)并且它无法使用您的文件。

【讨论】:

  • 感谢您解决这个问题。我最终找到了一个更简单的解决方案,而无需阅读我以前不知道的打印内容中的输入。不幸的是,你是正确的,Transcrypt 和 Wrangler 仍然抛出错误,但希望我能解决这个问题。
  • Transcrypt 无法将所有代码转换为 JavaScript - 出于安全原因,某些函数在 JavaScript 中不可用,其中一些需要外部模块,但 Transcrypt 不知道,一些 Python 模块使用 C/无法转换为 JavaScript 和 JavaScript 的 C++ 代码不能使用 C/C++ 创建的外部库
  • 一些解决方法是使用 Python 创建网页并将数据发送到可以使用所有 Python 函数和模块的服务器,并将结果作为 HTML 发送到浏览器。而这个方法使用Bokeh and Dash甚至Jupyter
  • 不幸的是,这将在更大的 Cloudflare Workers 框架中使用,该框架仅允许以转译 JS 形式(通过 Transcrypt)的 Python,因此我将无法使用任何其他解决方法。我通常会按照这些思路做一些事情,而不需要转译,但工人需要这样做
【解决方案2】:

能够重新设计以前使用 pandas 收集输出的(效率极低的)方法:

df = pd.read_gbq(sql, project_id=project_id)

我以前不知道的更快、更简单的解决方案。目前仍然与 Transcrypt 不兼容,但至少解决了这部分问题。

【讨论】:

  • 据我所知Transcrypt 可能不支持外部模块 - 仅支持一些标准模块。而且它不支持使用 C/C++ 创建的模块,这些模块必须转换为 Web Assembler - 请参阅 Transcrypt 问题:Possible to import any packages (scipy, numpy, pandas etc)? 但它提到 Pyodide 使用 Iodie 类似于 Jupyter 使用 Web 浏览器显示结果,但代码在服务器上运行。
  • 是的,我最终发现这一点很困难,但我已经批准您的答案是正确的,因为它不依赖任何这些模块。现在困难的部分是弄清楚如何导入google-cloud-bigquery。它有一个 javascript 源,但我不确定如何将它添加到 python 文件中,因为我无法编辑 Transcrypt 后的最终转译代码
猜你喜欢
  • 2014-08-27
  • 1970-01-01
  • 2012-01-22
  • 2020-12-23
  • 2020-05-06
  • 2017-01-28
  • 2019-11-15
  • 1970-01-01
相关资源
最近更新 更多