Итак, я решил это, хотя и довольно хакерским способом.
Флаги, которые я передавал в pip, предназначались для уменьшения размера зависимостей c, а не зависимостей fortran.Поэтому не было никаких проблем с использованием предварительно скомпилированных зависимостей фортрана, которые обычно загружаются через pip.
Итак, сначала я создал эталонную версию неизмененного пакета scipy в папке sp:
pip install scipy -t sp
Затем я создал программу go, которая будет действовать как обертка вокруг компилятора gfortran (или технически вокруг ссылки на компилятор gfortran в / usr / bin)
package main
import "os"
import "strings"
import "io/ioutil"
import "log"
import "os/exec"
import "fmt"
func checkErr(err error) {
if err != nil {
log.Fatal(err)
}
}
func exists(path string) (bool, error) {
_, err := os.Stat(path)
if err == nil { return true, nil }
if os.IsNotExist(err) { return false, nil }
return true, err
}
func copyr(src string, dst string) {
// Read all content of src to data
data, err := ioutil.ReadFile(src)
checkErr(err)
// Write data to dst
err = ioutil.WriteFile(dst, data, 0644)
checkErr(err)
}
func main() {
search_folder := "/home/ec2-user/sp/scipy"
wrapped_compiler := "/usr/bin/inner_gfortran"
argsWithProg := os.Args
noProg := os.Args[1:]
primed := 0
check := "-o"
var (
cmdOut []byte
err error
)
for _, el := range argsWithProg {
if primed == 1{
primed = 0
s := strings.Split(el, "scipy")
if len(s) != 2{
continue
}
src := search_folder + s[1]
src_exi, _ := exists(src)
if src_exi == false {
continue
}
primed = 2
dir_parts := strings.Split(el, "/")
dir_parts = dir_parts[:len(dir_parts)-1]
dir := strings.Join(dir_parts,"/")
exi, _ := exists(dir)
if exi == false {
os.MkdirAll(dir, os.ModePerm)
}
os.Create(el)
copyr(src, el)
}
if el == check{
primed = 1
}
}
if primed == 0 {
if cmdOut, err = exec.Command(wrapped_compiler, noProg...).Output(); err != nil {
fmt.Fprintln(os.Stderr, "There was an error running fortran compiler: ", err)
os.Exit(1)
}
os.Stdout.Write(cmdOut)
}
}
Переместил фактический компилятор в inner_gfortran
sudo mv /usr/bin/gfortran /usr/bin/inner_gfortran
И поместите упаковщик go на его место
Оболочка передаст большинство инструкций компилятору, но если инструкция состоит в том, чтобы скомпилировать программу на фортране, и скомпилированный двоичный файл уже существует вВ моей справочной версии scipy оболочка просто копирует справочную версию в новую компилируемую версию.
И это было сделано.Версии scipy и numpy уменьшенного размера теперь работают на aws lambda для python 3.6.