岁月是把杀猪刀:杀死了脚本,杀死了节点......

in voilk •  8 days ago

    有首名为《杀猪刀》歌曲有这样一段歌词:岁月是一把杀猪刀,黑了木耳、紫了葡萄、软了香蕉。好吧,仔细品味一下,貌似这歌不太健康?不过时间真的是把杀猪刀,会改变很多事情呢。

    time-2798567_960_720.jpg
    (图源 :pixabay)

    昨晚在自己电脑上看自己以前写的一些脚本,突然想运行一下试试。

    虚拟运行环境问题

    拿了一个最简单的脚本测试了一下,结果给我一大堆错误:
    1731808971222.png

    文字版错误内容如下(附上文字版,方便Google等搜索引擎收录以及自己以后搜索):

    Could not find platform independent libraries <prefix>
    Could not find platform dependent libraries <exec_prefix>
    Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
    Fatal Python error: Py_Initialize: Unable to get the locale encoding
    ModuleNotFoundError: No module named 'encodings'

    讲真,这种错误我还是第一次遇到,查了一下百度,嗯,给我的结果也是云山雾罩。

    那么只有自己去探究一下喽,首先查查我运行这个程序使用的python在哪里,以及是什么版本:

    whereis python

    显示结果为:

    python: /home/xxxxxxx/venv/bin/python

    看来调用的是我Python虚拟运行环境中的程序,嗯,这看起来很正常。这是对应目录下的部分文件,也很正常:
    1731809397757.png

    既然执行文件没问题,就去库里看看喽,结果一看,还真发现问题了:
    1731809537551.png

    简单来讲,就是一堆断掉的软链接:
    1731809664892.png

    而对比一下我当前好用的Python虚拟运行环境
    1731810059316.png

    可见其中Python可执行文件是指向系统的Python,同样,这些依赖库也没有单独复制到虚拟环境下,而是使用系统python相应的依赖库。

    简单来讲,就是当年的Python虚拟环境过时啦,造成这种问题的原因我不清楚,可能是使用了不同的Virtualenv工具?也可能是使用了过时的配置参数?

    不过感觉再去追究当时如何如何,已经没有太大的意义了,毕竟已经过了四年多了,时间是把杀猪刀,也把我曾经运行得好好的程序杀掉,是很正常的事情嘛。

    至于解决起来,其实也很简单,不过就是Python虚拟运行环境的问题嘛,重新建一个就是喽。这次我用的又是virtualenv

    virtualenv --python /usr/bin/python3 .venv

    总是搞不清楚创建python虚拟运行环境的几种方法之间的异同,不过我就是传说中的差不多先生,好用就好,何必纠结过多呢?

    当然了,新建Python虚拟运行环境,意味着之前环境中安装的库啊之类的都没法用了。虽然我觉得可以通过从旧环境中复制相关内容到新环境,但是何不直接安装新的库呢,这样一切都是最新(最安全)的,多完美呀。

    节点问题

    做完这些工作后,再次运行一下我之前的脚本,额,还是有问题,发现脚本中用的是一个公链的本地节点,而这个节点我已经停止运行四年多了。

    脚本中也有写其它节点,不过测试了一下,脚本中的其它非本地节点也都关闭了... 呜呜呜,岁月真的是把杀猪刀,不但杀掉了我的节点,还杀掉了一堆公共节点。

    1731811253780.png

    socket.gaierror: [Errno -2] Name or service not known

    从出错信息上看,应该不光对应的节点光了,而是整个域名都没啦。去浏览器打开看一眼,果然如此:
    1731811526816.png

    这域名真的不错,如果不是它要价$ 79,995 USD,我都想买下来了。

    费了九牛二虎之力,总算找到几个好用的公共节点,继续尝试,节点到是没问题了,又遇到了新问题。

    time.clock() 问题

    话说我的脚本中用了一些和时间有关的函数来度量脚本的执行时间,相关代码类似这个样子:

    start = time.time()
    cpu_start = time.clock()
    process_start = time.process_time()
    perf_start = time.perf_counter()
    ......
    end = time.time()
    cpu_end = time.clock()
    process_end = time.process_time()
    perf_end = time.perf_counter()
    print("CPU Time:", cpu_end - cpu_start)
    print("Proc Time:", process_end - process_start)
    print("Exec Time:", end - start)
    print("Perf Time:", perf_end - perf_start)
    

    结果运行时报如下错误:

    AttributeError: module 'time' has no attribute 'clock'

    好在当年写相关脚本时,就记得time.clock()是有问题的,主要就是time.clock()在Linux下和Windows下行为不一致。所以在Python 3.8中,它被彻底移除啦。

    既然都被移除了,咱就不用完了呗,从代码中移除相应语句,一切都OK了。嗯,四年多以前的脚本,总算可以跑起来啦。

    hourglass-620397_960_720.jpg

    当脚本跑起来之后,有些激动、有些感慨、有些迷惘。激动的是,又见到一些熟悉的内容,感慨的是如今时过境迁,杀猪刀杀掉的不止是脚本、节点、time.clock()还有币价和当年的激情啊。

    至于让我迷惘的则是,脚本能跑,但是好多内容,我去看不懂了呢,要从头好好捋捋。还有就是要用来做点啥呢?

      Authors get paid when people like you upvote their post.
      If you enjoyed what you read here, create your account today and start earning FREE VOILK!