关于Service写法:
2019/04/18更新:把python程序写成xx.service就可以使用sudo systemctl [start|restart|stop] xx.service的方式运行它了,就跟之前我们耳熟能详的nginx一个调用法。一个service需要有三个模块:[Unit]、[Service]、[Install]。这里我们可以去下面三个地方看看别人软件里service的写法:
cd /lib/systemd/system可以查看本地配置的系统文件
cd /run/systemd/system可以查看运行时配置的系统文件
cd /usr/lib/systemd/system软件包安装的系统单元
其中的一些service写法如下:
对于[Unit]来说主要是对于这个service的描述,以及它的一个基础环境配置,比如这个服务运行之前Requires哪些其他服务,在这个服务运行After有哪些服务需要起来。
算了,本来想详细讲讲发现内容海了去了,http://www.mamicode.com/info-detail-1744270.html,这里是个小手册了,我接着讲我见过的。
对于[Service]主要是一个执行路径ExecStart,里面是运行代码的命令,以及代码主程序的位置。Environment就是代码的依赖包的位置,大多数依赖我们pip下来了,还有一些自己写的代码的依赖就需要放到Environment中。
对于[Install]主要是一个WantedBy,这里要讲一下系统的level,也就是运行级别,multi-user.target是无桌面的,属于(level3),而graphical.target是有桌面的(属于level5),我这里遇到的这个alsa的问题就出在这个target上,直接运行./main.py是没问题的,有声音,但是运行这个service就没有声音了,原因就是出在我在有桌面的情况下跑了multi-user.target。把桌面关掉就可以了。可以用journalctl -u xx.service查看运行日志,
关于python模块发布:
2019/04/09更新:一个更简单的方法:https://blog.csdn.net/zuliang001/article/details/81902973
python3 -m compileall <dir>//针对一个文件夹
python3 -m py_compile xx.py//针对一个文件
里面的__pycache__文件夹就是放着pyc文件
关于把文件弄成绿色(不弄成绿色也能执行的样子,可能好看?)//ls -la查看本身的权限,421读写执行,ugo用户组其他
2019/04/04?忘了哪天发的:教程:https://blog.csdn.net/xluren/article/details/41114779
1.我的目录是~/testPublish/publish,该目录下有自己写好的Module.py文件。
2.在~/testPublish/publish目录下新建一个__init__.py文件和一个setup.py文件,setup.py文件中加入:
如果setup.py写在~/testPublish目录下的话就需要将上面的py_modules那里改为py_modules=['publish.Module']
3.编辑好setup.py文件之后运行python3 setup.py sdist生成一个源码包以及一个MANIFEST文件:
进入dist目录将Module-0.3.tar.gz用tar -zxvf解压得到Module-0.3,文件夹内容如下:
MANIFEST是自动生成的:
4.运行sudo python3 setup.py install:
5.已经可以导入Module模块。
上一步操作是实现了import Module,要实现import publish.Module需要将setup.py放在~/testPublish目录而不是~/testPublish/publish目录下。
sudo pip3 uninstall Module按理来说是可以卸载的,但结果是:
__pycache__也就是保存了pyc,也就是PyCodeObject的持久化方式,运行时解释器会将PyCodeObject保存在内存中,在运行结束时持久化成一个pyc文件,保存下来,如果未修改下次可通过直接调用pyc文件来加快执行速度。
运行时环境一共有三个:完全静态环境(全局、静态变量一类的)、基于栈的环境、完全动态环境(堆,向上增长)。
用户使用指针可以减少栈的使用量,堆的速度会稍微快一点。
这里提一下指针传递和值传递和引用传递:
这个其实是一个很简单的点了,今天才大概理解了一下意思:
//testRef
#include<iostream>
using namespace std;
void testCommon(int x)
{
x++;
//return x;
}
void testRef(int &x)
{
x++;
//return x;
}
void testPoint(int *x)
{
(*x)++;
//return (*x);
}
/*int testCommon(int x)
{
x++;
return x;
}
int testRef(int &x)
{
x++;
return x;
}
int testPoint(int *x)
{
(*x)++;
return (*x);
}*/
int main()
{
int a = 6;
int b = 0;
int c = 0;
//a = testCommon(a);//7
//b = testRef(b);//1
//c = testPoint(&c);//1
testCommon(a);//6
testRef(b);//1
testPoint(&c);//1
cout << a << endl << b << endl << c << endl;
system("pause");
}
以上有两种方式传递出函数内部的值,一种是通过return,将局部变量传出函数,一种则是不return,函数得到的结果直接反应在变量上。所以能发现return传出值的方式是肯定可以将函数内部的局部变量的处理结果直接反应在函数外部的,即使这个函数栈在结束的时候销毁了,也一样能获取到,也就是7。然而不return的方式下,普通的值传递,也就是testCommon(a)这里,值是无法保存下来的,因为++a=7的这个值随着函数栈的销毁也丢失了,但是testRef(b)和testRef(&c)的值就算不通过return也能返回到main函数中。
搞定。