我正在尝试使用PyInstaller创建一个供公司内部使用的应用程序.该脚本在工作的python环境中运行良好,但在转换为包时会丢失一些东西.
我知道如何在我的包中包含和引用我自己需要的数据文件,但是在导入时包含或引用应该进入的文件时遇到问题.
我正在使用一个名为tk-tools的可安装pip的软件包,它包含一些用于面板式显示器的漂亮图像(看起来像LED).问题是,当我创建一个pyinstaller脚本时,任何时候引用其中一个图像,我都会收到一个错误:
DEBUG:aspen_comm.display:COM23 19200
INFO:aspen_comm.display:adding pump 1 to the pump list: [1]
DEBUG:aspen_comm.display:updating interrogation list: [1]
Exception in Tkinter callback
Traceback (most recent call last):
File "tkinter\__init__.py", line 1550, in __call__
File "aspen_comm\display.py", line 206, in add
File "aspen_comm\display.py", line 121, in add
File "aspen_comm\display.py", line 271, in __init__
File "aspen_comm\display.py", line 311, in __init__
File "lib\site-packages\tk_tools\visual.py", line 277, in __init__
File "lib\site-packages\tk_tools\visual.py", line 289, in to_grey
File "lib\site-packages\tk_tools\visual.py", line 284, in _load_new
File "tkinter\__init__.py", line …Run Code Online (Sandbox Code Playgroud) 我想引用这个问题,因为我确信有人会将此标记为重复.
我不是在寻找另一个对supervisord的引用.我确信它很棒,但节点PM2具有我需要的功能,并且更容易实现和测试.
在原型设计过程中,我创建了一个名为"p3env"的虚拟环境.在每个脚本的顶部,我放置一个bash指令:
#!./py3env/bin/python
Run Code Online (Sandbox Code Playgroud)
这允许我使用这个特定的python环境执行目录中的每个脚本,而不必激活它.这是非常方便和有用的,当我手动启动时,python脚本运行良好.
当我说"手工启动"时,我应该清楚我的意思.我的脚本叫做'strain_to_db.py'.当我手动启动时,我通过ssh在shell上:
./strain_to_db.py
Run Code Online (Sandbox Code Playgroud)
这使得我需要工作的一切工作.
为了让pm2工作,我开始:
pm2 start ./strain_to_db.py
Run Code Online (Sandbox Code Playgroud)
显然pm2忽略了python脚本顶部的指令,并尝试使用全局'python'执行.没问题,我可以指定解释器:
pm2 start ./strain_to_db.py --interpreter /home/ubuntu/db_if/p3env/bin/python
Run Code Online (Sandbox Code Playgroud)
没有骰子.再次,也许尝试更多的绝对路径:
pm2 start /home/ubuntu/db_if/strain_to_db.py --interpreter /home/ubuntu/db_if/p3env/bin/python
Run Code Online (Sandbox Code Playgroud)
现在我感到很沮丧.我尝试了另一种策略.我尝试使用以下命令在命令行中运行python可执行文件:
/home/ubuntu/db_if/p3env/bin/python /home/ubuntu/db_if/strain_to_db.py
Run Code Online (Sandbox Code Playgroud)
当没有涉及pm2时,这很好用.当我尝试使用'命令行参数'样式将其传递给pm2时:
pm2 start /home/ubuntu/db_if/p3env/bin/python -- /home/ubuntu/db_if/strain_to_db.py
Run Code Online (Sandbox Code Playgroud)
同样的错误.错误总是'无法导入pymysql',它只安装在虚拟环境中.
我不知道还有什么可以用的.我有几个脚本要添加到pm2执行监视器,但我似乎无法让其中一个启动并正确运行.
我对 TDD 有点陌生,尽管我已经使用 C 有一段时间了。因此,我使用 ceedling 来测试我的嵌入式项目。
我可以rake test:all在 gcc 中,但我现在试图将其移至嵌入式目标模拟器。我正在通过“project.yml”文件指定我的交叉编译器、链接器等。
当我rake test:all在“编译 cmock.c”时出现错误(其他几个文件编译没有问题):
< path_to_cmock >/cmock.c:17:31: 错误:数组“CMock_Guts_Buffer”的大小太大
在此之后还有其他错误,但这是导致它们开始的错误。
当我转到 时cmock.c,我在文件顶部看到了这个:
#ifdef CMOCK_MEM_DYNAMIC
static unsigned char* CMock_Guts_Buffer = NULL;
static CMOCK_MEM_INDEX_TYPE CMock_Guts_BufferSize = CMOCK_MEM_ALIGN_SIZE;
static CMOCK_MEM_INDEX_TYPE CMock_Guts_FreePtr;
#else
static unsigned char CMock_Guts_Buffer[CMOCK_MEM_SIZE + CMOCK_MEM_ALIGN_SIZE];
static CMOCK_MEM_INDEX_TYPE CMock_Guts_BufferSize = CMOCK_MEM_SIZE + CMOCK_MEM_ALIGN_SIZE;
static CMOCK_MEM_INDEX_TYPE CMock_Guts_FreePtr;
#endif
Run Code Online (Sandbox Code Playgroud)
完美,所以我只需要找到这些声明的位置。我进行了文本搜索,只是发现它们没有在任何地方声明......所以我怀疑它们来自 ceedling 中的默认值。
我找到了 CMOCK 的文档,在“编译选项”下,
还存在许多 #defines 用于自定义 cmock 体验...
它继续列出我在源代码中找到的#defines,但没有说明在哪里可以找到它们。我试图用适当的定义制作一个包含文件,并通过“project.yml”传递包含文件,但没有运气。
我怀疑答案非常简单,只是我搜索过的任何地方都没有概述。感谢您的时间,
我正在读取一个串口并将其写入文本区域作为滚动值.我创建了SerialPortReader类,它运行良好.我的主代码只是调用"updateTextArea()"来告诉类textarea的位置.这工作将持续一段时间,但是当我开始向串口输入更多数据时 - 比如~100字节 - Java感觉NullPointerException.如果我注释掉"updateTextArea()"调用(〜第13行),那么就没有异常.当我取消注释"updateTextArea"时,该程序可以完美地工作大约一分钟.我怀疑textarea缓冲区正在填满,但我不知道如何增加缓冲区大小或如何使新文本将旧文本推出缓冲区.
打印到控制台工作正常 - 大概 - 永远.我只运行了大约10分钟,但它没有那么多打嗝.
class SerialPortReader implements SerialPortEventListener {
byte[] serialData;
TextArea textArea;
@Override
public void serialEvent(SerialPortEvent event) {
try{
serialData = serialPort.readBytes();
for(byte dataReceived: serialData){
System.out.println("Byte Received: " + dataReceived);
}
updateTextArea();
} catch (SerialPortException ex){
System.out.println(ex);
}
}
public void initiateTextAreaUpdate(TextArea ta){
textArea = ta;
}
public void updateTextArea(){
if(textArea != null){
for(int i = 0; i < serialData.length; i++){
textArea.appendText(serialData[i] + "\n");
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
例外:
Exception in thread "EventThread …Run Code Online (Sandbox Code Playgroud)