我想打电话给# -*- mode: python -*-
# source: http://qaru.site/questions/8036799/pyinstaller-does-not-work-when-including-pysnmp
from PyInstaller.utils.hooks import collect_data_files, collect_submodules
x = Tree('C:/Python37/Lib/site-packages/pysnmp/smi/mibs',prefix='pysnmp/smi/mibs',excludes='.py')
block_cipher = None
a = Analysis(['SNMP.py'],
pathex=['path to python file/'],
binaries=[],
datas=[],
hiddenimports=['pysnmp.smi.exval','pysnmp.cache'] + collect_submodules('pysnmp.smi.mibs') + collect_submodules('pysnmp.smi.mibs.instances'),
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
x,
name='SNMP',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=True , icon='icon.ico')
,但我尝试了以下操作,但它给我错误
Math.Round()
答案 0 :(得分:4)
您应该使用Math.GetType()
而不是typeof(Math)
来代表表示类型Type
的{{1}}实例,因为Math
是一种类型,而不是实例类型。
还有更多示例:
Math
尽管这不是必需的,但我将第一个参数作为typeof(int) // ok, int is a type
5.GetType() // ok, 5 is an instance of int
typeof(5) // error, 5 is not a type
int.GetType() // error, int is not an instance
放在Invoke
上,因为您正在调用静态方法:
null
编辑:
刚刚意识到您仍然有一些问题。 Console.WriteLine(method.Invoke(null, 1.78d));
有很多重载,因此仅使用Round
是模棱两可的。您还必须指定参数的类型(GetMethod("Round")
)。
double
的第二个参数是Invoke
,因此您需要使用语法object[]
创建一个数组。
new object[] { ... }
答案 1 :(得分:1)
我在这里看到您的代码有3个问题
typeof(Math)
而不是Math.GetType()
来获得Type
Math.Round()
作为大量重载,因此您指定要与GetMethod(String, Type[])一起使用的重载,例如 Math.Round(Double) ,因此您应该写MethodInfo method = typeof(Math).GetMethod(mathFunc, new[] {typeof(double) }) ;
method.Invoke(this,... )
应该用method.Invoke(null, ..)
代替,尽管使用此名称是接受的Math.round是静态的,并且第一个对象参数无论如何都将变为空。因此完整的代码可以是这样的
string mathFunc = "Round";
MethodInfo method = typeof(Math).GetMethod(mathFunc, new[] {typeof(double) }) ;
var res = method.Invoke(null, new object[] { 1.78d });
Console.WriteLine(res);
输出:2