1.Python打包之Nuitka分发
2.javaï¼System.out.println();
3.luadec软件ä¸è½½ï¼
4.单机模式与伪分布模式有什么区别?
5.Flink源码编译
6.freebsd下jail命令说明
Python打包之Nuitka分发
大家好,今天来分享如何使用 Nuitka 编译 Python 代码进行分发。关注的编译选项是 --standalone 和 --onefile。这些选项在打包 Python 程序时非常有用,特别是当你需要在不同系统中分发程序时。
我们以一个名为 talk_example.py 的laravel源码阅读简单示例程序开始。使用 --standalone 选项编译时,会生成一个独立的可执行程序,并包含所有必需的库。执行此选项后,会生成两个文件夹:*.build 和 *.dist。其中,*.build 文件夹包含编译后的源码文件,而 *.dist 文件夹则包含可执行文件和动态库文件。关注的可执行文件是 talk_example.bin,运行它即可执行程序。
使用 --onefile 选项时,程序会将所有依赖项和库打包到单个可执行文件中,大大减少了文件数量,非常适用于分发应用程序。编译后,只关注生成的 talk_example.bin 文件。运行此文件可直接执行程序,无需额外文件。
需要注意的是,--standalone 和 --onefile 选项生成的可执行文件仅适用于指定的操作系统,如 CentOS(Linux)。对于 Windows 系统,教师节源码使用 Nuitka 编译时会生成 .exe 文件。确保根据目标操作系统分别编译以确保兼容性。
总结,使用 Nuitka 的 --standalone 和 --onefile 选项可以高效地为 Windows、Linux 和 MacOS 系统编译 Python 代码。通过选择合适的编译选项,你可以优化和分发 Python 应用程序。下次再见,希望这些信息对您有帮助。
javaï¼System.out.println();
outæ¯Systemæä¾çç¨äºæ åè¾åºçæµï¼å¨æ²¡æéå®åçæ åµä¸ï¼ä¼ç´æ¥æå°å°ç»ç«¯ï¼èprintlnè¿ä¸ªæ¹å¼å®é ä¸æ¯PrintStreamç±»æä¾çåè½
éå®åé误è¾åºå¨jdkä¸æä¸æ®µè¯´æï¼
é常ï¼æ¤æµå¯¹åºäºæ¾ç¤ºå¨è¾åºæè ç±ä¸»æºç¯å¢æç¨æ·æå®çå¦ä¸ä¸ªè¾åºç®æ ãæç §æ¯ä¾ï¼æ¤è¾åºæµç¨äºæ¾ç¤ºé误æ¶æ¯ï¼æè æ¾ç¤ºé£äºå³ä½¿ç¨æ·è¾åºæµï¼åé out çå¼ï¼å·²ç»éå®åå°é常ä¸è¢«è¿ç»çè§çæä¸æ件æå ¶ä»ç®æ ï¼ä¹åºè¯¥ç«å»å¼èµ·ç¨æ·æ³¨æçå ¶ä»ä¿¡æ¯ã
luadec软件ä¸è½½ï¼
对äº*.luaæ件,éè¦ç¨ä»ä¹è½¯ä»¶ç¨åºæå¼
1ãå¦ææ¯æ¥ççè¯ï¼å¯ä»¥å®è£ ä¸äºç¬¬ä¸æ¹çè®°äºæ¬è½¯ä»¶ï¼ç¶åç¨ä»ä»¬æå¼luaæ件è¿è¡æ¥çãæè ç´æ¥ä¿®æ¹åç¼å为ææ¬ææ¡£æ ¼å¼ï¼ä½¿ç¨è®°äºæ¬æå¼ã
2ã以å°ç±³max2为ä¾ï¼å®åææºæå¼luaæ件æ¹æ³å¦ä¸ï¼é¦å å¯ä»¥å°å®ç½ä¸è½½ä¸ä¸ªGGï¼ä¸è½½ä¹åè¯è¨è®¾ç½®ä¸å³å¯ï¼è®°ä½è¿éä¸å®è¦æ¯å¨å®ç½ä¸è½½çï¼ä¸è½½ä¹åä¼å®è£ 两个çæ¬ï¼ä¸ä¸ªæ¯ç¡¬ä»¶å éï¼ä¸ä¸ªæ¯è½¯ä»¶å éï¼ä¸¤ä¸ªé½å¯ä»¥ä½¿ç¨ã
3ãé¦å æ£æ¥èªå·±Windowä¸æ没æå®è£ Luaï¼å¦æ没æçè¯mand
下面开始在jail里面运行它:
tester# jail /jail jailed.host.name $JAILED_IP_ADDR /usr/local/sbin/pure-ftpd [options]
这里,/jail是你的jail环境的位置,也就是被jail之后,应用程序“以为”自己所在的“/”的位置;jailed.host.name是你打算提供给这个jail环境的主机名,某些情况下,应用程序需要知道这个变量;$JAILED_IP_ADDR是你打算提供ftp服务(如果是其他应用软件,那就是其他服务咯,比如web服务)的那个IP地址,至于/usr/local/sbin/pure-ftpd [options] 则是你打算运行的那个应用程序在jail里面的所在位置以及运行所需的参数。
然后用ps 查看一下进程状态:
tester# ps -axf |grep pureftpd
? IsJ 0:. pure-ftpd (SERVER) (pure-ftpd)
可以看到所有这些pure-ftpd的进程都有一个J,标志这这一程序正在jail下面运行。
这时候可能会有一些管理用的程序无法正常工作,因为这些管理用程序无法找到他们需要访问的那些文件,只要找到这些应用程序需要调用的文件(比如日志文件)的位置,然后制造一个soft link就可以了,通常这些管理程序都可以继续正常运行。
到此为止,一个针对应用程序的业务介绍网源码jail构造完成。
第二类,构造受控制的主机
在这种情况下面,我们首先需要构造一个当前版本操作系统的完整镜像(下面这个脚本是从FreeBSD 4.6r的man page里面来的,实际上4.5以及之前的man page在构造jail目录树脚本上面都有一定的问题,4.6才纠正过来):
tester# cat /root/mkjail.sh
jailhome=/data/jail
cd /usr/src
mkdir -p $jailhome
make world DESTDIR=$jailhome
cd etc
make distribution DESTDIR=$jailhome -DNO_MAKEDEV_RUN
cd $jailhome/dev
sh MAKEDEV jail
cd $jailhome
ln -sf dev/null kernel
^D
tester# sh /root/mkjail.sh
最后在/data/jail下面获得一个完整的根据当前源码树编译得来的jail目录树。
接下来:
/
*tester# mkdir $jailhome/stand
tester# cp /stand/sysinstall $jailhome/stand
tester# jail $jailhome jailed.system.box ..0. /bin/csh
(这时候就获得了一个jail下面的shell)
jailed# /stand/sysinstall
*/
通过sysinstall这个程序可以对jail系统的常用变量进行设置,比如时区,DNS,Mail。还有jail系统在“启动”的时候需要执行的程序。
如果你足够熟悉这个系统,可以考虑自己手工一个个的做过来。
复制/etc/localtime 到 $jailhome/etc,使jail环境下的应用程序可以得到正确的时间;
复制/etc/resolv.conf 到 $jailhome/etc/resolv.conf 使jail下面可以正确解释域名;
在jail里面运行newaliases 避免sendmail的不断抱怨;
如果打算运行inetd,需要修改inetd的启动参数,加上 -a $LISTEN_ADDR 选项(因为jail无法自己获得当前系统的ip地址,所以必须提供一个ip地址给它)在rc.conf里面看起来应该是这样:
inetd_flags="-wW -a ..0."
将系统本身的syslogd 运行加上 -ss 选项,避免这个syslog启动****端口;修改/etc/rc.conf 加上 syslogd_flags="-ss" (对$jailhome/etc/rc.conf也如法炮制)
在jail内创建一个空的/etc/fstab,在rc.conf里面去掉网卡地址的绑定,这样在jail系统在启动的时候不会抱怨。
为了实际运行这个jail系统,还需要为jail提供一个可以连接的IP地址,这个地址可以与实际环境同一个子网,也可以处于另外一个子网中。
tester# ifconfig fxp0 ..0. netmask 0xffffffff alias
(这里为网卡fxp0绑定了一个别名,准备提供服务。)
所有这些东西都执行完了以后,拾光书源码可以有几个方法把jail系统启动起来,一个是在jail外面运行
tester# jail $jailhome jailed.system.box $jail_IP_ADDR /bin/sh $jailhome/etc/rc
一个是单纯把ssh/telnetd这样一些提供远程访问的服务在jail内启动起来:
tester# jail $jailhome jailed.system.box $jail_IP_ADDR /bin/sh $jailhome/bin/inetd -wW -a $jail_IP_ADDR
然后从外面登录系统,运行、配置jail系统环境,或者手工启动需要的应用服务。
如果打算运行一个用于生产环境的jail系统的话,推荐使用第一种方法,并且把启动jail的命令放到(实际环境的)/etc/rc.local脚本里面去,这样jail系统可以有比较完备,与实际机器相类似的环境。
这样一个jail系统就算构造完成并且可以正常运作,加上在实际环境里面定期的严格的备份,安全检查与审计,就可以得到一个很不错的安全系统。一般的scriptkids已经无法对你的系统构成实际威胁,即使是某些与黑帽子走得很近的人在漏洞公开之前得到实际的攻击脚本,并且进入你的系统,他也只能在jail里面活动,而且你可以知道他什么时候进入和离开系统,做了什么。这样你可以很轻松的恢复系统和防范下一次未知的攻击。
在jail系统的管理上面有几个问题需要注意:
1. jail里面的帐号、密码是跟实际系统不同的,但是在jail之外ps或者查看jail目录树内的文件时,那些jail内部的uid会被看成外部的uid,因此最好把jail里面的/etc/adduser.conf进行修改,把他们的xml文件解析 源码uid起始号码放大,比如:uid_start="",这样当你在jail外部进行文件、进程管理的时候不至于误会文件或者进程的宿主。
2. jail内的任何活动,其能力都受到了限制。比如top/vmstat这样的东西都不能使用,mknod,dd等等这样需要访问直接硬件的东西也无法工作。所以在jail内监控系统运行状态也比较难。
3. 当想要远程关闭jail系统的时候,可以有两种方法,一是进入jail之后kill -TERM -1 或者 kill -KILL -1 ,这样向所有该jail内的进程发送SIGTERM或者SIGKILL信号,也可以在jail里面运行/etc/rc.shutdown来关闭jail。如果是本地想要关闭jail倒是简单,只要把所有带有J标记的进程干掉就可以了。
4. 一个系统可以运行多个jail,各个jail之间无法互相干涉,如果在jail外面使用
tester# jail $jailhome jailed.system.box $jail_IP_ADDR /path/to/application
这种方式运行某个应用程序,下一次试图通过运行
tester# jail $jailhome jailed.system.box $jail_IP_ADDR /bin/csh
这种方式获得的jail过的shell来管理该应用程序将会失败。因为这时是两个各自独立的jail,互相不能干涉。为了能对jail系统内进程灵活地进行管理,推荐在jail里面除开应用软件之外,再启动telnetd或者sshd之类的服务,这些服务此时与应用程序运行在同一个jail里面,就可以通过远程登入系统后获得与那些应用程序在同一个jail内的shell。
5. jail系统内的所有应用软件版本号应该与外部实际系统保持一致。当外部系统的源码同步到某个版本并且重新做过make world之后,推荐也重新生成一次jail,以避免某些可能的莫名其妙的错误。
6. 另外有一个做法不知道是否正确,在jail里面每次使用ps的时候,系统都会报告没有/var/run/dev.db文件,让人感觉很不舒服,复制实际系统的/var/run/dev.db 到 $jailhome/var/run/ ,就不会再碰到这个问题。
Spark-Submit 源码剖析
直奔主题吧:
常规Spark提交任务脚本如下:
其中几个关键的参数:
再看下cluster.conf配置参数,如下:
spark-submit提交一个job到spark集群中,大致的经历三个过程:
代码总Main入口如下:
Main支持两种模式CLI:SparkSubmit;SparkClass
首先是checkArgument做参数校验
而sparksubmit则是通过buildCommand来创建
buildCommand核心是AbstractCommandBuilder类
继续往下剥洋葱AbstractCommandBuilder如下:
定义Spark命令创建的方法一个抽象类,SparkSubmitCommandBuilder刚好是实现类如下
SparkSubmit种类可以分为以上6种。SparkSubmitCommandBuilder有两个构造方法有参数和无参数:
有参数中根据参数传入拆分三种方式,然后通过OptionParser解析Args,构造参数创建对象后核心方法是通过buildCommand,而buildCommand又是通过buildSparkSubmitCommand来生成具体提交。
buildSparkSubmitCommand会返回List的命令集合,分为两个部分去创建此List,
第一个如下加入Driver_memory参数
第二个是通过buildSparkSubmitArgs方法构建的具体参数是MASTER,DEPLOY_MODE,FILES,CLASS等等,这些就和我们上面截图中是对应上的。是通过OptionParser方式获取到。
那么到这里的话buildCommand就生成了一个完成sparksubmit参数的命令List
而生成命令之后执行的任务开启点在org.apache.spark.deploy.SparkSubmit.scala
继续往下剥洋葱SparkSubmit.scala代码入口如下:
SparkSubmit,kill,request都支持,后两个方法知识支持standalone和Mesos集群方式下。dosubmit作为函数入口,其中第一步是初始化LOG,然后初始化解析参数涉及到类
SparkSubmitArguments作为参数初始化类,继承SparkSubmitArgumentsParser类
其中env是测试用的,参数解析如下,parse方法继承了SparkSubmitArgumentsParser解析函数查找 args 中设置的--选项和值并解析为 name 和 value ,如 --master yarn-client 会被解析为值为 --master 的 name 和值为 yarn-client 的 value 。
这之后调用SparkSubmitArguments#handle(MASTER, "yarn-client")进行处理。
这个函数也很简单,根据参数 opt 及 value,设置各个成员的值。接上例,parse 中调用 handle("--master", "yarn-client")后,在 handle 函数中,master 成员将被赋值为 yarn-client。
回到SparkSubmit.scala通过SparkSubmitArguments生成了args,然后调用action来匹配动作是submit,kill,request_status,print_version。
直接看submit的action,doRunMain执行入口
其中prepareSubmitEnvironment初始化环境变量该方法返回一个四元 Tuple ,分别表示子进程参数、子进程 classpath 列表、系统属性 map 、子进程 main 方法。完成了提交环境的准备工作之后,接下来就将启动子进程。
runMain则是执行入口,入参则是执行参数SparkSubmitArguments
Main执行非常的简单:几个核心步骤
先是打印一串日志(可忽略),然后是创建了loader是把依赖包jar全部导入到项目中
然后是MainClass的生成,异常处理是ClassNotFoundException和NoClassDeffoundError
再者是生成Application,根据MainClass生成APP,最后调用start执行
具体执行是SparkApplication.scala,那么继续往下剥~
仔细阅读下SparkApplication还是挺深的,所以打算另外写篇继续深入研读~
打包Python代码的常用方法,让你的程序变成exe应用!
在编程的世界里,Python以其强大的功能深受开发者喜爱。然而,分享Python代码时,他人可能需要安装Python解释器才能运行,这无疑增加了用户门槛。这时,将Python代码打包成易于使用的.exe应用,无疑让分享和部署变得简单。本文将深入探讨几种常用的Python代码打包技术,让你的程序轻松化身为独立的执行文件。为什么打包Python代码?
打包Python代码成可执行文件,其优势不言而喻:便携性: 可执行文件无需依赖Python环境,可在任何未安装Python的系统上运行,极大提升了应用的通用性。
代码保护: 可执行文件通常难以反编译,能有效保护源代码,确保知识产权安全。
用户体验提升: 用户无需手动安装Python,只需双击即可启动,简化了使用流程。
几种打包工具大揭秘
下面我们将逐一介绍几种主流的Python代码打包工具:PyInstaller: 作为最受欢迎的工具之一,它支持Windows、macOS和Linux平台,安装简单,只需在终端中输入pip install pyinstaller。使用时,只需将脚本my_script.py放入命令行,如 pyinstaller my_script.py,它会自动处理依赖并生成dist目录下的可执行文件。
cx_Freeze: 另一个跨平台的解决方案,通过pip install cx_Freeze安装。创建setup.py配置文件后,如 cxfreeze setup.py build,即可生成可执行文件。
py2exe: 专为Windows设计,pip install py2exe即可安装。配置setup.py文件后,通过 python setup.py py2exe 生成可执行文件。
py2app: 专为macOS打造,pip install py2app后,通过 python setup.py py2app 生成.dmg文件,包含可执行程序。
Nuitka: 用于将Python脚本编译为可执行文件,pip install nuitka后,使用 nuitka --standalone my_script.py 进行编译,生成my_script.dist目录中的可执行文件。
选择合适的工具
每种工具都有其适用场景:PyInstaller和cx_Freeze适合多平台部署,py2exe对Windows用户友好,py2app则专为macOS设计。如果你追求更高的性能和可移植性,Nuitka的编译技术是个不错的选择。根据你的目标平台和需求,选择合适的工具,让Python程序无需Python环境就能华丽转身为独立应用。总结
将Python代码打包成可执行文件,无疑为应用程序的分享和部署带来了革命性的变革。通过PyInstaller、cx_Freeze、py2exe、py2app和Nuitka,你可以轻松将Python脚本转化为用户友好的exe应用,无论你是为了分享,还是构建独立工具,这些工具都能让过程变得简单易行。选择一个工具,让Python的力量触手可及!