1

我正在关注transcrypt提供的入门部分,创建了一个名为 hello 的文件夹,然后创建了这两个文件hello.pyhello.html

我的目标是在客户端运行一个函数并将结果输出到网页

hello.py

from datetime import datetime
import time
import random

def FUN():
    for i in range(random.randrange(1, 9)):
        time.sleep(random.randrange(10 , 30 ))
        print (f"Current time {datetime.now()} , Number {i}")


hello.html

<script type="module">import * as hello from './__target__/hello.js'; window.hello = hello;</script>
    <p>
    <div id = "FUN">...</div>
    <button onclick="hello.FUN()">Do code</button>

启动服务器python3 -m http.server并浏览到 hello.html

当我按下按钮做代码时,我什么也得不到

[08/May/2021 04:30:16] "GET /hello.html HTTP/1.1" 200 -
127.0.0.1 - - [08/May/2021 04:30:17] code 404, message File not found
127.0.0.1 - - [08/May/2021 04:30:17] "GET /__target__/hello.js HTTP/1.1" 404 -
127.0.0.1 - - [08/May/2021 04:30:17] code 404, message File not found
127.0.0.1 - - [08/May/2021 04:30:17] "GET /favicon.ico HTTP/1.1" 404 -

我使用命令安装 transcryptpip3 install transcrypt

但是当我运行这个命令时python -m transcrypt -b -m -n hello.py

它以这个输出中止

Saving target code in: /home/kali/n3w/__target__/org.transcrypt.__runtime__.js
Saving target code in: /home/kali/n3w/__target__/re.translate.js
Saving target code in: /home/kali/n3w/__target__/re.js
Saving target code in: /home/kali/n3w/__target__/warnings.js

Error while compiling (offending file last):
        File '/home/kali/n3w/hello.py', line 1, at import of:
        File '/home/kali/.local/lib/python3.9/site-packages/wget.py', line 562, at import of:
        File '/usr/lib/python3.9/optparse.py', line 90, at import of:
        File '/usr/lib/python3.9/gettext.py', line 718, at import of:
        File '/usr/lib/python3.9/locale.py', line 658, at import of:
        File '_bootlocale', line 8, namely:

        Import error, can't find any of:
                /home/kali/n3w/locale.py
                /home/kali/n3w/locale.js
                /home/kali/.local/lib/python3.9/site-packages/transcrypt/modules/locale.py
                /home/kali/.local/lib/python3.9/site-packages/transcrypt/modules/locale.js
                /home/kali/n3w/locale.py
                /home/kali/n3w/locale.js
                /home/kali/n3w/_bootlocale.py
                /home/kali/n3w/_bootlocale.js
                /home/kali/.local/lib/python3.9/site-packages/transcrypt/modules/_bootlocale.py
                /home/kali/.local/lib/python3.9/site-packages/transcrypt/modules/_bootlocale.js
                /home/kali/n3w/_bootlocale.py
                /home/kali/n3w/_bootlocale.js
                /home/kali/n3w/_locale.py
                /home/kali/n3w/_locale.js
                /home/kali/.local/lib/python3.9/site-packages/transcrypt/modules/_locale.py
                /home/kali/.local/lib/python3.9/site-packages/transcrypt/modules/_locale.js
                /home/kali/n3w/_locale.py
                /home/kali/n3w/_locale.js
                /usr/lib/python3.9/_locale.py
                /usr/lib/python3.9/_locale.js
                /usr/lib/python3.9/lib-dynload/_locale.py
                /usr/lib/python3.9/lib-dynload/_locale.js
                /home/kali/.local/lib/python3.9/site-packages/_locale.py
                /home/kali/.local/lib/python3.9/site-packages/_locale.js
                /home/kali/testing_0505/npm_socket/batavia/_locale.py
                /home/kali/testing_0505/npm_socket/batavia/_locale.js
                /usr/local/lib/python3.9/dist-packages/_locale.py
                /usr/local/lib/python3.9/dist-packages/_locale.js
                /usr/lib/python3/dist-packages/_locale.py
                /usr/lib/python3/dist-packages/_locale.js
                /usr/lib/python3.9/dist-packages/_locale.py
                /usr/lib/python3.9/dist-packages/_locale.js


Transcrypt 站点有关于如何设置小演示的步骤,但没有详细说明每个命令的作用

4

2 回答 2

2

Transcrypt 目前适用于 Python 3.7。新版本正在制作中,但可能需要一段时间。亲切的问候,雅克·德·胡格

于 2021-05-08T12:45:51.693 回答
1

这里有一些信息,也许有帮助。

  • 您的系统还安装了 Python 3.9,并且在您键入“python”时它会优先考虑。

    要使用 3.7 版,您可能必须键入“python3.7”或类似内容,具体取决于您使用的操作系统。要查看键入“python”时使用的版本,可以使用:

      python --version
    

    要查看 python 所在的位置(您可能还可以找到 3.7 版本),请使用以下命令:

      whereis python  # depends on your OS
    
  • 使用python 虚拟环境来避免不必要的问题。

    例如:使用内置的“venv”模块:

      # within your project folder:
      python3.7 -m venv package_dir
    
      # The above creates a directory called package_dir,
      # where local project python packages can go.
      # Then 'activate', after which you can use 'python'
      # to refer to the version of python in the package_dir,
      # and 'pip' to refer to pip3 etc.:
      source package_dir/bin/activate
    
      # Will now install transcrypt in package_dir, not globally.
      pip install transcrypt
    
  • Transcrypt 不包含很多标准库,在这些情况下您可以使用 js。这个 SO question权衡了浏览器中各种 python 选项的优缺点。

    例如,我注意到random.randrange 没有实现,但 randint 是。如果感兴趣,请参阅CPython 源代码中的 randrange ,这暗示了为什么它不在 Transcrypt 中。randint(a, b) 与 randrange(a, b + 1) 相同。

    查看 Transcrypt 的时间实现,睡眠被排除在外,因为当时在浏览器中处理它需要一个循环(阻塞)。

因此,假设您因为性能和占用空间小而想使用 Transcrypt,并决定 randint 可以满足您的需求,并且您想使用非阻塞 js 版本的 sleep,这看起来是这样的:

from datetime import datetime
import random

# Add a js function that can be called by your python code.
__pragma__ ('js', '{}', '''
// Will not block main thread.
function async_sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms * 1000));
}
''')

# We're using async / await to avoid blocking the main thread.
async def FUN():
    for i in range(random.randint(1, 9 - 1)):
        await async_sleep(random.randint(10 , 30 - 1))
        current_time = f"Current time {datetime.now()} , Number {i}"
        # To output to the DOM, use js DOM functions.
        document.getElementById('FUN').innerHTML += current_time + '<br>'

相比之下,线程阻塞版本的 sleep 可能看起来像这样。

from datetime import datetime
import random

__pragma__ ('js', '{}', '''
// Bad, will block main thread.
function blocking_sleep(sec) {
    var unixtime_ms = new Date().getTime();
    while(new Date().getTime() < unixtime_ms + sec * 1000) {}
}
''')

def FUN():
    for i in range(random.randint(1, 9 - 1)):
        blocking_sleep(random.randint(10 , 30 - 1))
        current_time = f"Current time {datetime.now()} , Number {i}"
        # print() outputs to the dev console.
        print (current_time)
        document.getElementById('FUN').innerHTML += current_time + '<br>'
于 2021-05-12T10:14:24.893 回答