OnlineJudge评测程序Python实现(一)Compile

前言:

为了完成dlnuoj首先要解决的判题核心问题,这里采用Python语言的方法来实现。接下来将一步一步实现简单判题核心的功能。

Compile篇

(一)思路:

通过Python的subprocess模块,调用外部命令,然后将代码生成相应的可执行文件即可。这里要注意外部命令的写法,各大OJ网站都有参考,当然也要跟据自身PC机环境,具体写法会在之后需要的时候进行更新。

(二)代码:

import time
import subprocess
dir_work = "./"
def compile(language):
    build_cmd = {
        "gcc": "gcc main.c -o main -Wall -lm -O2 -std=c99 --static -DONLINE_JUDGE",
        "g++": "g++ main.cpp -O2 -Wall -lm --static -DONLINE_JUDGE -o main",
        "java": "javac Main.java",
        "ruby": "ruby -c main.rb",
        "perl": "perl -c main.pl",
        "pascal": 'fpc main.pas -O2 -Co -Ct -Ci',
        "go": '/opt/golang/bin/go build -ldflags "-s -w"  main.go',
        "lua": 'luac -o main main.lua',
        "python2": 'python2 -m py_compile main.py',
        "python3": 'python3 -m py_compile main.py',
        "haskell": "ghc -o main main.hs",
    }
    p = subprocess.Popen(build_cmd[language],shell=True,cwd=dir_work,stdout=subprocess.PIPE,stderr=subprocess.PIPE) #cwd设置工作目录
    out,err = p.communicate()#获取编译错误信息
    if p.returncode == 0: #返回值为0,编译成功
        return True
    #update_compile_info(solution_id,err+out) #编译失败,更新题目编译错误信息
    print(err,out)
    return False


if __name__ == '__main__':
    language = input("输入要进行编译的language:")
    print(compile(language))

(三)运行结果:



(四)代码详解:

subprocess.Popen()的简单用法:

class Popen(args, bufsize=0, executable=None,  
                    stdin=None, stdout=None, stderr=None,  
                    preexec_fn=None, close_fds=False, shell=False,  
                    cwd=None, env=None, universal_newlines=False,  
                    startupinfo=None, creationflags=0):  
参数分析:

-args  可以是字符串或序列数据如list,要执行的程序名应在参数序列的第一个位置上,后面可以跟

   程序所需要的命令行参数

shell   在UNIX 上默认  shell=False, 在这种情况下类Popen 用  os.execvp() 来执行子程序,

   args  应该是一个序列,字符串也被看作只有程序名的序列。

   当 shell=True, 如果 args 是字符串,它将作为命令行字符串通过shell 执行.如果是一个序列,

   它的第一个条目将作为命令行字符串,后面的条目作为附加的shell参数。

   在 Windows 上,类Popen 用 CreateProcess() 来执行子程序,它以字符串作为参数。 

   如果args 是一个序列,它将通过 list2cmdline 方法转化为字符串,要注意的是不是所有的MS Windows

   用相同的方法解释命令行。

- bufsize 如果被赋值,值将作为内建函数open() 的参数,0意味着无缓冲,1就是行缓冲,任何其它的正值,

   意味着用和给定值大小接近的一个缓冲,负值就使用系统默认的缓冲尺寸,类的默认值是0无缓冲.(实时清空缓冲区)

- stdin, stdout and stderr 分别指定子程序的标准输入,标准输出,标准错误输出的文件句柄,有效值是一个存在的文件对象

   PIPE (一个正整数)或者是None, 若赋值为PIPE ,就会为子程序创建新管道pipe , 若为None ,就不为子程序创建管道,

   子程序的文件句柄继承父程序。另外,stderr 可以是STDOUT, 这表明子程序的错误数据应该被获得存入相同的文件句柄,

   通过stdout输出.

-  preexec_fn 被赋值一个可以调用的对象,这个对象在子程序执行前调用到子进程,

- close_fds 是true , 所有的文件描述符号除了0,1,2 在子程序执行前将被关闭。

- shell 是true ,命令行参数将通过shell 执行。

- cwd 不是None ,在子程序执行前,当前的工作目录将变为cwd。

- env 不是None , 它将为新进程指定环境变量。

- universal_newlines是true, 文件对象stdout,stderr将被打开作为text文件,行将被中断通过

   这些 '\n' (Unix), '\r' (Mac), '\r\n ' (Win)换行符号,所有这些外部的符号被python 看作'\n' .

   注意这些特征只在python支持通用换行的时候有效(默认支持)

   communicate()方法没有更新对文件换行属性的支持

- startupinfo , creationflags 被赋值,它将传递一个潜在的创建进程的方法CreateProcess(),

   它能指定主创口外观,和新进程的优先等级(Win上有效)


下面是成员方法:

poll() 检测子进程是否终止,返回执行结果状态

wait() 等待子进程终止,返回执行结果

communicate(input=None) :与子进程交流,把该方法括号中的数据发送到子进程的标准输入stdin,

   数据格式应该是字符串,若为None,则不给子进程发送数据。返回的元组从stdout,stderr中读取

   数据直到文件结尾。

   communicate() returns a tuple (stdout, stderr).

   返回包含两个元素的元组,第一是stdout输出的字符串,第二个是stderr的字符串,

out, err = std.communicate()

   注意:输出的字符串缓存在内存中,因此,如果输出数据较多时候应该避免使用这个方法。

下面是成员变量:

stdin 如果stdin=PIPE,这个属性是个文件对象,提供子进程的输入,否则它是None

   obj.stdin.write(" args ")

stdout 如果stdout=PIPE,这个属性是个文件对象,提供子进程的输出,否则它是None

   obj.stdout.read() 

stderr 如果stderr=PIPE,这个属性是个文件对象,提供子进程的错误输出,否则它是None

pid  子程序的进程ID

returncode 子程序返回码,None 说明子进程没有终止,负值-N 说明被符号-N终止 (UNIX only)。



  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于使用CNN来实现一维EEG信号分类的Python程序,你可以按照以下步骤进行操作: 1. 导入所需的库: ```python import numpy as np import tensorflow as tf from tensorflow.keras import layers ``` 2. 准备数据集。确保数据集包含输入信号和对应的标签。 3. 对数据进行预处理。根据需要,你可能需要对数据进行归一化或标准化等预处理操作。 4. 划分训练集和测试集。将数据集划分为训练集和测试集,用于模型的训练和评估。 ```python from sklearn.model_selection import train_test_split # 假设你已经将数据集存储在X和y中,其中X是特征,y是标签 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) ``` 5. 构建CNN模型。使用Keras库构建一个简单的CNN模型。 ```python model = tf.keras.Sequential() # 添加卷积层 model.add(layers.Conv1D(filters=16, kernel_size=3, activation='relu', input_shape=(timesteps, channels))) # 添加池化层 model.add(layers.MaxPooling1D(pool_size=2)) # 添加更多的卷积层和池化层,具体根据需求进行调整 # 将一维数据展平成一维向量 model.add(layers.Flatten()) # 添加全连接层 model.add(layers.Dense(units=128, activation='relu')) # 添加输出层 model.add(layers.Dense(units=num_classes, activation='softmax')) ``` 6. 编译和训练模型。 ```python model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(X_train, y_train, epochs=10, batch_size=32, validation_data=(X_test, y_test)) ``` 7. 评估模型。 ```python test_loss, test_accuracy = model.evaluate(X_test, y_test) print('Test Loss:', test_loss) print('Test Accuracy:', test_accuracy) ``` 这只是一个简单的示例代码,你可以根据你的具体需求进行修改和扩展。希望对你有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值