用Python3、NetCore、Shell分別開發一個Ubuntu版的定時提醒(附NetCore跨平台兩種發布方式)


匯總系列:https://www.cnblogs.com/dunitian/p/4822808.html#ai

Python3 與 C# 基礎語法對比:https://www.cnblogs.com/dotnetcrazy/p/9102030.html

新增直接運行py文件的補充:請在py前面加上:#!/usr/bin/env python3 然后再執行 sudo chmod +x ./task.py 下次運行直接 ./task.py

平時經常用定時提醒來提高工作效率,到了Linux。。。。蒙圈了,以前C#寫的不能跨平台啊,於是就有了這篇文章~(有些人喜歡用番茄工作法,這個算是個福利了)

跳轉到Python:https://www.cnblogs.com/dotnetcrazy/p/9111200.html#python

先NetCore吧:(old code:me

核心代碼:Process.Start("notify-send", "友情提醒 10分鍾過去了");

原理說明:調用了ubuntu的notify-send的彈窗提醒,自己控制循環和定時

補充知識:RuntimeInformation.IsOSPlatform(OSPlatform.xxx) 這個來判斷是什么系統,OSPlatform是一個結構體

定時提醒:Thread.Sleep(new TimeSpan(0, 10, 0));

代碼比較簡單就不詳說了,主要講講環境部署+發布

using System;
using System.Threading;
using System.Diagnostics;
using System.Runtime.InteropServices;

//Old: https://github.com/dunitian/DNTLive/blob/master/Software/LoTTimer/Program.cs
namespace netcore
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                try
                {
                    Console.WriteLine(DateTime.Now.ToString());
                    Thread.Sleep(new TimeSpan(0, 10, 0));
                    MyBeep();
                }
                catch
                {
                    //異常還不結束?
                    break;
                }
            }
        }
        private static void MyBeep()
        {
            if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
            {
                Console.WriteLine("當前系統為Linux");
                Process.Start("notify-send", "友情提醒 10分鍾過去了");
                //用shell啟動指定程序+命令
                //Process.Start(new ProcessStartInfo("notify-send", "友情提醒 10分鍾過去了") { RedirectStandardOutput = true });
            }
            else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
            {
                Console.WriteLine("當前系統為Windows");
                // frequency:提示音的頻率,介於 37 到 32767 赫茲之間。// duration:提示音的持續時間,以毫秒為單位。
                Console.Beep(500, 1500);
            }
            else
            {
                Console.WriteLine("精力有限,暫不支持");
            }
        }
    }
}

來走一個流程:(基本上跟官網走一遍,我貼幾個鏈接和圖)

我以前寫的文章:https://www.cnblogs.com/dunitian/p/6745562.html#netcore2.1

官方文檔(多看看官方文檔):https://www.microsoft.com/net/download/linux-package-manager/ubuntu18-04/sdk-current

2.創建一個netcore的console應用:dotnet new console

3.安裝VSCode(直接下載安裝deb包即可):http://www.cnblogs.com/dunitian/p/6661644.html

4.安裝VSCode的C#擴展

5.打開剛才那個文件夾,F5試運行一下,新版的貌似不用自己配置運行路徑什么的了

6.剛才代碼貼了,coding一下。調試運行什么的和win下沒什么大區別

7.1發布吧,講一下官方推薦的發布方式(適合開發人員),到項目目錄下,Ctrl+ALT+T調出終端==》 dotnet publish –c release

參考:https://docs.microsoft.com/zh-cn/dotnet/core/deploying/deploy-with-cli

這種輕量級方式發布,把這兩個文件弄出去就ok了

運行效果:dotnet xxx.dll,如果你改了程序名字,對應配置名字也記得改哦~

7.2發布第二種方式【很多人不是開發人員也不想裝runtime】(指定應用程序運行時(自宿主應用),這種方式將會把指定平台的Core CLR打包進去):

發布前先做一件事情,添加你需要支持的哪些系統,我這邊win10和Ubuntu18就好了(別忘了)

在<PropertyGroup>標簽里面添加<RuntimeIdentifiers>win10-x64;ubuntu.18.04-x64;</RuntimeIdentifiers>

 

系統命名以及系統支持參考:(貌似Android也是支持的)

https://docs.microsoft.com/zh-cn/dotnet/core/rid-catalog
https://github.com/dotnet/corefx/blob/master/pkg/Microsoft.NETCore.Platforms/runtime.json

修復依賴+發布指定系統的runtime:dotnet publish -c Release -r ubuntu.18.04-x64

其實netcore2.x系列不用再輸入restore了,它會自動執行restore

自托管的包挺大的

 

發現自動生成了個netcore無后綴文件,而且是可執行文件【為基礎薄弱的同志普及下:1.看顏色 2.ll 查看有沒有執行權限】,直接運行就OK了

來試着發布一個win10的:dotnet publish -c Release -r win10-x64

拖到win10來測試~ok,可以跨平台(其他平台一樣,發布的時候換下操作系統即可)

 

這次輪到Python了

 其實核心代碼都差不多,幾句話解決

import os
import time

while True:
    print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
    time.sleep(600)
    os.system("notify-send 友情提醒 10分鍾過去了")

運行(其實你可以自己把他設置為可執行程序【chmod +x ./task.py】,這樣在終端中直接./task.py就運行了)

新增補充:記得py文件前面加上:#!/usr/bin/env python3 

Shell:(有些人在微信公眾號問我,shell怎么獲取時間,我這邊改了下shell代碼)【其實shell方便之處在於直接執行系統命令,系統獲取時間:date,那shell加一行即可】

while :
do
 date
 sleep 600
  echo -e '\a'
 notify-send 友情提醒 已經過了10分鍾了
done

知識點補充:

直接輸入python進入交互模式,相當於啟動了Python解釋器,但是等待你一行一行地輸入源代碼,每輸入一行就執行一行。

直接運行.py文件相當於啟動了Python解釋器,然后一次性把.py文件的源代碼給執行了,你是沒有機會以交互的方式輸入源代碼的。

附錄(Python加強版

 

V0.2.1 add 音樂斷點續播、修復鎖屏偶爾出現的屏幕旋轉bug

#!/usr/bin/env python3

import os
import time
from multiprocessing.dummy import Pool


def move_screen():
    """旋轉屏幕來提示"""
    os.system("xrandr -o left")  # 左旋轉90度
    # 下面兩行應該不用加,防止鎖屏時出現Bug,就加上了
    time.sleep(2)
    os.system("xrandr -o normal")  # 恢復正常


# 大概多少秒(n的整數倍較好)PS:def reset(n)
global_how_time = 240
global_time = 0  # 開始播放時間(全局臨時變量)


def play_music():
    """播放音樂來提醒"""
    global global_time, global_how_time
    # os.system("mpv ~/音樂/莫問明天.mp3")
    if global_time > global_how_time:
        global_time = 0  # 防止超出時間
    os.system(f"mpv ~/音樂/莫問明天.mp3 --start={global_time}")


def reset(n=1):
    """友情提醒"""
    os.system("xrandr -o normal")  # 恢復正常
    time.sleep(n)
    global global_time
    global_time += n  # 繼續播放
    os.system("pkill mpv")  # 關閉音樂
    print("等待下一次擁抱...")


if __name__ == "__main__":
    pool = Pool()
    while True:
        print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
        time.sleep(1200)  # 20 分鍾
        os.system("notify-send 逆天友情提醒 20分鍾過去了")
        pool.apply_async(play_music)
        pool.apply_async(move_screen)
        reset(30)  # 休息30s

V0.2.0 add 音樂播放、更明顯的提示

eg:屏幕旋轉,注意恢復命令:xrandr -o normal

#!/usr/bin/env python3

import os
import time
from multiprocessing.dummy import Pool


def move_screen():
    """旋轉屏幕來提示"""
    os.system("xrandr -o left")  # 左旋轉90度
    # time.sleep(2)
    # os.system("xrandr -o normal")  # 恢復正常


def play_music():
    """播放音樂來提醒"""
    os.system("mpv ~/音樂/莫問明天.mp3")


def reset(n=1):
    """友情提醒"""
    os.system("xrandr -o normal")  # 恢復正常
    time.sleep(n)
    os.system("pkill mpv")  # 關閉音樂
    print("等待下一次擁抱...")


if __name__ == "__main__":
    pool = Pool()
    while True:
        print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
        os.system("notify-send 逆天友情提醒 10分鍾過去了")
        pool.apply_async(play_music)
        pool.apply_async(move_screen)
        reset(10)
        time.sleep(600)

我稍微說下Linux日常使用的體驗,可以略過這段:(這段放最后吧,不然認為我是打廣告的就不太好了o((>ω< ))o)

以前開發環境都是Win10或者Win系列,后來Net跨平台了,慢慢的開發專用筆記本也換成了Ubuntu,關於Linux基礎和環境等就不說了,可以看我以前寫的文章(https://www.cnblogs.com/dunitian/p/4822808.html#linux

Linux基本上還用的慣,之前開發工具突然間從VS變成了JetBrains Rider (Netcore的Console程序在linux下有時候有些莫名錯誤,所以才搭上了Rider)和 VSCode,陡然間稍有不適,用了幾天就熟悉了。所以開發相關的Linux基本上和Win差不多

關鍵是日常比較蛋疼,貼個常用deb安裝包,https://pan.baidu.com/s/1kVI8eft 這個就不細說了可以參考我以前在Ubuntu16.04上發的文章(http://www.cnblogs.com/dunitian/p/6670560.html),截圖自帶的勉強能用Alt+PrtScr,用不慣可以用國產deepin-screenshot或者用hotshots也行。播放器可以自己安裝一下:sudo apt-get  install  smplayer

其他的其實也沒啥了,文檔有WPS,音樂有網易雲,輸入法有搜狗,詞典可以選擇有道,瀏覽器反正谷歌嘛。暫時不需要Linux版的錄屏軟件(有好的可以推薦哦~)【記得我前面講dock的時候提過一款(http://www.cnblogs.com/dunitian/p/6681832.html)】

回頭可能考慮再開發一個水印工具,以前開發的用慣了:https://github.com/dunitian/DNTLive/tree/master/Software/WaterMarkAPP

 好久沒寫文章了,寫個文章好慢。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM