如何从pyinstaller打包的python项目中的字符串实例化某些class?
howto instantiate certain class from string in python project packed by pyinstaller?
我正在使用 getattr,但我无法让它与 pyinstaller 一起工作
简短摘要:
- Python 3.5.1 |蟒蛇 4.0.0(64 位)| (默认,2016 年 2 月 16 日,09:49:46)[MSC v.1900 64 位 (AMD64)] on win32
- 我有项目,由 pyinstaller 打包成单个文件
- 我有带脚本的外部文本文件 (Subs.py)
我的项目无法在 Subs.py 中实例化 class Subs ..
在我通过 pyinstaller 打包项目之前,我可以从 Subs.py..
你能告诉我,下面的例子有什么问题吗?
为了说明我的问题,我准备了一个非常简单的例子。
folder structure:
root- #folder
-to #folder
-__init__.py #file
-Subs.py #file
-main.py #file
main.py:
import importlib
MyClass = getattr(importlib.import_module("to.Subs"), "Subs")
instance = MyClass()
instance.test()
Subs.py:
class Subs():
def test(self):
print("test")
此刻,按预期执行return:
python main.py
test
但是如果我用 pyinstaller 打包项目(通过 pip 最新安装)
pyinstaller main.py -F
然后我将 main.exe 移动到 root 并执行:
main.exe
Traceback (most recent call last):
File "main.py", line 3, in <module>
MyClass = getattr(importlib.import_module("to.Subs"), "Subs")
File "importlib\__init__.py", line 126, in import_module
File "<frozen importlib._bootstrap>", line 986, in _gcd_import
File "<frozen importlib._bootstrap>", line 969, in _find_and_load
File "<frozen importlib._bootstrap>", line 944, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 986, in _gcd_import
File "<frozen importlib._bootstrap>", line 969, in _find_and_load
File "<frozen importlib._bootstrap>", line 956, in _find_and_load_unlocked
ImportError: No module named 'to'
Failed to execute script main
知道吗,我是什么 missing/doing wrogly? ?
“你是对的。简单地使用 --hidden-import=Subs 是行不通的。你必须将它与 -p DIR 选项一起使用并指向包含你的模块的文件夹。如果失败,你也可以尝试将文件捆绑为附加数据。 – 8 月 8 日 14:31
“
我将此标记为答案,因为我可以通过使用 --hidden-import & -b...
成功 instan.class
归功于 ->Repiklis
我正在使用 getattr,但我无法让它与 pyinstaller 一起工作
简短摘要:
- Python 3.5.1 |蟒蛇 4.0.0(64 位)| (默认,2016 年 2 月 16 日,09:49:46)[MSC v.1900 64 位 (AMD64)] on win32
- 我有项目,由 pyinstaller 打包成单个文件
- 我有带脚本的外部文本文件 (Subs.py)
我的项目无法在 Subs.py 中实例化 class Subs ..
在我通过 pyinstaller 打包项目之前,我可以从 Subs.py.. 你能告诉我,下面的例子有什么问题吗?
为了说明我的问题,我准备了一个非常简单的例子。
folder structure:
root- #folder
-to #folder
-__init__.py #file
-Subs.py #file
-main.py #file
main.py:
import importlib
MyClass = getattr(importlib.import_module("to.Subs"), "Subs")
instance = MyClass()
instance.test()
Subs.py:
class Subs():
def test(self):
print("test")
此刻,按预期执行return:
python main.py
test
但是如果我用 pyinstaller 打包项目(通过 pip 最新安装) pyinstaller main.py -F 然后我将 main.exe 移动到 root 并执行:
main.exe
Traceback (most recent call last):
File "main.py", line 3, in <module>
MyClass = getattr(importlib.import_module("to.Subs"), "Subs")
File "importlib\__init__.py", line 126, in import_module
File "<frozen importlib._bootstrap>", line 986, in _gcd_import
File "<frozen importlib._bootstrap>", line 969, in _find_and_load
File "<frozen importlib._bootstrap>", line 944, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 986, in _gcd_import
File "<frozen importlib._bootstrap>", line 969, in _find_and_load
File "<frozen importlib._bootstrap>", line 956, in _find_and_load_unlocked
ImportError: No module named 'to'
Failed to execute script main
知道吗,我是什么 missing/doing wrogly? ?
“你是对的。简单地使用 --hidden-import=Subs 是行不通的。你必须将它与 -p DIR 选项一起使用并指向包含你的模块的文件夹。如果失败,你也可以尝试将文件捆绑为附加数据。 – 8 月 8 日 14:31 “ 我将此标记为答案,因为我可以通过使用 --hidden-import & -b...
成功 instan.class归功于 ->Repiklis