无some.py时import some.pyc

admin 2023年3月16日16:53:21评论21 views字数 2329阅读7分45秒阅读模式

26.29 无some.py时"import some.pyc"

https://scz.617.cn/python/201309251607.txt

Q:

现有is_prime_pub.pyc,没有is_prime_pub.py,此种情况可以直接执行pyc

python is_prime_pub.pyc 59

想进一步,在other.py中"import is_prime_pub",并调用is_prime_pub中函数。

A: falsetru@stackoverflow 2013-09-25

参看

Import arbitrary python source file. (Python 3.3+)
https://stackoverflow.com/questions/19009932/import-arbitrary-python-source-file-python-3-3

至少有三种写法,用Python 3.9.0测试无误

import importlib.machinery
import importlib.util

#
# Load the compiled module from the .pyc file
#
loader          = importlib.machinery.SourcelessFileLoader( 'is_prime_pub', 'is_prime_pub.cpython-39.opt-2.pyc' )
spec            = importlib.util.spec_from_loader( loader.name, loader )
is_prime_pub    = importlib.util.module_from_spec( spec )
loader.exec_module( is_prime_pub )

#
# Call a method in the module
#
low_prime       = [2,3]
low_prime      += [x for x in range(5,2047,2) if is_prime_pub.rabin_miller_test(x,b=2,rounds=1)]
print( is_prime_pub.is_prime( 59, low_prime, 5 ) )

import importlib.machinery
import types

#
# Load the compiled module from the .pyc file
#
loader          = importlib.machinery.SourcelessFileLoader( 'is_prime_pub''is_prime_pub.cpython-39.opt-2.pyc' )
is_prime_pub    = types.ModuleType( loader.name )
loader.exec_module( is_prime_pub )

#
# Call a method in the module
#
low_prime       = [2,3]
low_prime      += [x for x in range(5,2047,2if is_prime_pub.rabin_miller_test(x,b=2,rounds=1)]
print( is_prime_pub.is_prime( 59, low_prime, 5 ) )

用的是SourcelessFileLoader,不是SourceFileLoader,用后者时报错

ValueError: source code string cannot contain null bytes

无some.py直接加载some.pyc时,解释器会检查pyc首部"magic number",必须匹配当前解释器版本,否则报错,比如

ImportError: bad magic number in 'is_prime_pub': b'arrn'

import importlib.machinery

#
# Load the compiled module from the .pyc file
#
loader          = importlib.machinery.SourcelessFileLoader( 'is_prime_pub', 'is_prime_pub.cpython-39.opt-2.pyc' )
is_prime_pub    = loader.load_module()

#
# Call a method in the module
#
low_prime       = [2,3]
low_prime      += [x for x in range(5,2047,2) if is_prime_pub.rabin_miller_test(x,b=2,rounds=1)]
print( is_prime_pub.is_prime( 59, low_prime, 5 ) )

load_module()已废弃,不建议使用,会有警告,但在Python 3.9.0中仍可用

DeprecationWarning: the load_module() method is deprecated and slated for removal in Python 3.12; use exec_module() instead

不要问为何有此需求

原文始发于微信公众号(青衣十三楼飞花堂):无some.py时import some.pyc

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年3月16日16:53:21
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   无some.py时import some.pychttp://cn-sec.com/archives/1608647.html

发表评论

匿名网友 填写信息