如何使用 Chaquopy 对 Android 的 python 脚本进行 cythonize?
How to cythonize a python script for Android using Chaquopy?
我的目标是 cythonize/obfuscate 一个使用 Cython 的 python 脚本用于 Android 平台。
到目前为止我尝试过的是:
我有一个 setup.py
from setuptools import setup
from Cython.Build import cythonize
import os
print(os.getcwd())
os.chdir('/sdcard/Download')
print(os.getcwd())
setup(
ext_modules=cythonize('test1.py')
)
这里我将目录更改为 /sdcard/Download/ 因为我想混淆的 python 脚本在该目录中。
- 案例一:
在 MainActivity.java 中调用 setup.py 就像:
Python py = Python.getInstance();
PyObject os= py.getModule("setup");
这样它会抛出一个错误:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.styleapp, PID: 2422
com.chaquo.python.PyException: SystemExit: usage: [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
or: --help [cmd1 cmd2 ...]
or: --help-commands
or: cmd --help
error: no commands supplied
at <python>.distutils.core.setup(core.py:136)
at <python>.setuptools.setup(__init__.py:161)
at <python>.setup.<module>(setup.py:8)
at <python>.importlib._bootstrap._call_with_frames_removed(<frozen importlib._bootstrap>:219)
at <python>.importlib._bootstrap_external.exec_module(<frozen importlib._bootstrap_external>:783)
at <python>.java.android.importer.exec_module(importer.py:503)
at <python>.java.android.importer.exec_module(importer.py:546)
at <python>.importlib._bootstrap._load_unlocked(<frozen importlib._bootstrap>:671)
at <python>.importlib._bootstrap._find_and_load_unlocked(<frozen importlib._bootstrap>:975)
at <python>.importlib._bootstrap._find_and_load(<frozen importlib._bootstrap>:991)
at <python>.importlib._bootstrap._gcd_import(<frozen importlib._bootstrap>:1014)
at <python>.importlib.import_module(__init__.py:127)
at <python>.chaquopy_java.Java_com_chaquo_python_Python_getModule(chaquopy_java.pyx:152)
at com.chaquo.python.Python.getModule(Native Method)
at com.example.styleapp.MainActivity.runthemodel(MainActivity.java:127)
at com.example.styleapp.MainActivity.access[=14=]0(MainActivity.java:47)
at com.example.styleapp.MainActivity.onMenuItemClick(MainActivity.java:103)
at androidx.appcompat.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:154)
at androidx.appcompat.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:991)
at androidx.appcompat.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:981)
at androidx.appcompat.widget.ActionMenuView.invokeItem(ActionMenuView.java:625)
at androidx.appcompat.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:151)
at android.view.View.performClick(View.java:7140)
at android.view.View.performClickInternal(View.java:7117)
at android.view.View.access00(View.java:801)
at android.view.View$PerformClick.run(View.java:27355)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7410)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935)
我明白这是因为我没有像我应该的那样传递任何参数:
python setup.py build_ext -b /sdcard/Download/ -t .
- 案例二:
如果我使用这个:
PyObject os= py.getModule("setup.py build_ext -b /sdcard/Download/ -t .");
我得到同样的错误。
我需要帮助来了解如何传递这些参数?
我尝试复制:
import os
os.system('python3 setup.py build_ext -b "/sdcard/Download/" -t .')
作为
PyObject os = py.getModule("os");
os.callAttr("system","python3 setup.py build_ext -b /sdcard/Download/ -t .");
但这甚至没有调用 setup.py 脚本。
我无法在实际 Android 设备上编译 Cython 模块的原因是,大多数设备都没有编译器。我想我们可以将 py 文件编译成 pyc,因为它们不依赖于机器。
我的目标是 cythonize/obfuscate 一个使用 Cython 的 python 脚本用于 Android 平台。
到目前为止我尝试过的是: 我有一个 setup.py
from setuptools import setup
from Cython.Build import cythonize
import os
print(os.getcwd())
os.chdir('/sdcard/Download')
print(os.getcwd())
setup(
ext_modules=cythonize('test1.py')
)
这里我将目录更改为 /sdcard/Download/ 因为我想混淆的 python 脚本在该目录中。
- 案例一:
在 MainActivity.java 中调用 setup.py 就像:
Python py = Python.getInstance();
PyObject os= py.getModule("setup");
这样它会抛出一个错误:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.styleapp, PID: 2422
com.chaquo.python.PyException: SystemExit: usage: [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
or: --help [cmd1 cmd2 ...]
or: --help-commands
or: cmd --help
error: no commands supplied
at <python>.distutils.core.setup(core.py:136)
at <python>.setuptools.setup(__init__.py:161)
at <python>.setup.<module>(setup.py:8)
at <python>.importlib._bootstrap._call_with_frames_removed(<frozen importlib._bootstrap>:219)
at <python>.importlib._bootstrap_external.exec_module(<frozen importlib._bootstrap_external>:783)
at <python>.java.android.importer.exec_module(importer.py:503)
at <python>.java.android.importer.exec_module(importer.py:546)
at <python>.importlib._bootstrap._load_unlocked(<frozen importlib._bootstrap>:671)
at <python>.importlib._bootstrap._find_and_load_unlocked(<frozen importlib._bootstrap>:975)
at <python>.importlib._bootstrap._find_and_load(<frozen importlib._bootstrap>:991)
at <python>.importlib._bootstrap._gcd_import(<frozen importlib._bootstrap>:1014)
at <python>.importlib.import_module(__init__.py:127)
at <python>.chaquopy_java.Java_com_chaquo_python_Python_getModule(chaquopy_java.pyx:152)
at com.chaquo.python.Python.getModule(Native Method)
at com.example.styleapp.MainActivity.runthemodel(MainActivity.java:127)
at com.example.styleapp.MainActivity.access[=14=]0(MainActivity.java:47)
at com.example.styleapp.MainActivity.onMenuItemClick(MainActivity.java:103)
at androidx.appcompat.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:154)
at androidx.appcompat.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:991)
at androidx.appcompat.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:981)
at androidx.appcompat.widget.ActionMenuView.invokeItem(ActionMenuView.java:625)
at androidx.appcompat.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:151)
at android.view.View.performClick(View.java:7140)
at android.view.View.performClickInternal(View.java:7117)
at android.view.View.access00(View.java:801)
at android.view.View$PerformClick.run(View.java:27355)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7410)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935)
我明白这是因为我没有像我应该的那样传递任何参数:
python setup.py build_ext -b /sdcard/Download/ -t .
- 案例二:
如果我使用这个:
PyObject os= py.getModule("setup.py build_ext -b /sdcard/Download/ -t .");
我得到同样的错误。
我需要帮助来了解如何传递这些参数?
我尝试复制:
import os
os.system('python3 setup.py build_ext -b "/sdcard/Download/" -t .')
作为
PyObject os = py.getModule("os");
os.callAttr("system","python3 setup.py build_ext -b /sdcard/Download/ -t .");
但这甚至没有调用 setup.py 脚本。
我无法在实际 Android 设备上编译 Cython 模块的原因是,大多数设备都没有编译器。我想我们可以将 py 文件编译成 pyc,因为它们不依赖于机器。