import python code and library in swift [duplicate]

  • Last Update :
  • Techknowledgy :

Copy in the contents of the module.map file below (into YOUR-SWIFT-ROOT/usr/lib/swift/python/module.map), Copy in the contents of the module.map file below (into YOUR-SWIFT-ROOT/usr/lib/swift/python/module.map) ,Unfortunately there isn't a way to avoid the crazy mangled names in the Python code right now (that I know of). So as you create Swift functions, you'll have to find the mangled name using nm:,But still... I thought it was pretty badass. And, seeing how there's already a Swift buildpack for Heroku you could move some slow code into Swift can call it as a library function. But, you know, not in production or anything. That would be silly, right?

cd SWIFT - ROOT / usr / lib / swift /
   mkdir python
touch module.map
# creates "libsit.so"(or on OS X, "libsit.dylib")
swiftc - emit - library sit.swift
1._
cd SWIFT - ROOT / usr / lib / swift /
   mkdir python
touch module.map
2._
# creates "libsit.so"(or on OS X, "libsit.dylib")
swiftc - emit - library sit.swift

Now this works!

$ python sit.py
Hamburger Hamburger
Bang!Bang!
nm libsit.so | grep YOUR_SWIFT_FN_NAME

modules.py

import ctypes

modules = ctypes.CDLL('/usr/lib64/python3.6/lib-dynload/libmodules.so')
modules.add.argtypes = (ctypes.c_int, ctypes.c_int)
modules.strlen.argtypes = (ctypes.c_char_p, )
modules.myname.argtypes = (ctypes.c_char_p, )
modules.myname.restype = ctypes.c_char_p

def add(x, y):
   result = modules.add(ctypes.c_int(x), ctypes.c_int(y))
return int(result)

def strlen(x):
   y = ctypes.c_char_p(x.encode())
return modules.strlen(y)

def myname(x):
   y = ctypes.c_char_p(x.encode())
return modules.myname(y).decode()

modules.swift

import Foundation

@_cdecl("add")
public func add (x: Int, y: Int) -> Int {
	return x+y
}

@_cdecl("strlen")
public func strlen (x: UnsafePointer<CChar>) -> Int{
    let s : String = "\(String(cString: x))"
    return s.count
}

@_cdecl("myname")
public func myname (x: UnsafePointer<CChar>) -> UnsafePointer<CChar>{
    let ret : String = "My name is \(String(cString: x))"
    return UnsafePointer<CChar>(ret)
}

@_cdecl("objc_autoreleaseReturnValue")
public func objc_autoreleaseReturnValue (x: Int) -> Int {
    return 0
}

The library libmodules.so is built with the following commands:

swiftc - emit - library modules.swift
cp mv libmodules.so / usr / lib64 / python3 .6 / lib - dynload

And now the module "modules.py" can be used like this:

python3 - c "import modules; print(modules.add(28, 42))"
70

python3 - c "import modules; print(modules.strlen('I compute the length of this string!'))"
36

python3 - c "import modules; print(modules.myname('Nobody'))"
My name is Nobody

modules.swift

import Foundation

@_cdecl("add")
public func add (x: Int, y: Int) -> Int {
	return x+y
}

@_cdecl("strlen")
public func strlen (x: UnsafePointer<CChar>) -> Int{
    let s : String = "\(String(cString: x))"
    return s.count
}

@_cdecl("myname")
public func myname (x: UnsafePointer<CChar>) -> UnsafePointer<CChar>{
    let ret : String = "My name is \(String(cString: x))"
    return UnsafePointer<CChar>(ret)
}

Suggestion : 2

Last updated 2021-02-03 UTC.

You can import Python modules from Swift, call Python functions, and convert values between Swift and Python.

import PythonKit
print(Python.version)
import PythonKit
print(Python.version)
3.6 .9(
   default, Oct 8 2020, 12: 12: 24)[GCC 8.4 .0]

In code, you can also call the PythonLibrary.useVersion function, which is equivalent to setting PYTHON_VERSION.

// PythonLibrary.useVersion(2)
// PythonLibrary.useVersion(3, 7)
4.0
Hello
slice(5, 10, None)
3
   [1, 2, 3]
4.0
Hello 
slice(5, 10, None)
3
[1, 2, 3]

// Convert Python objects back to Swift.
let int = Int(pythonInt)!
let float = Float(pythonFloat)!
let string = String(pythonString)!
let range = Range<Int>(pythonRange)!
   let array: [Int] = Array(pythonArray)!
   let dict: [String: [Int]] = Dictionary(pythonDict)!

   // Perform standard operations.
   // Outputs are the same as Python!
   print(Float(int) + float)
   print(string.prefix(6))
   print(range)
   print(array[2])
   print(dict["bar"]!)

Suggestion : 3

Importing everything with the asterisk (*) symbol is not a good programming practice. This can lead to duplicate definitions for an identifier. It also hampers the readability of our code.,While importing a module, Python looks at several places. Interpreter first looks for a built-in module. Then(if built-in module not found), Python looks into a list of directories defined in sys.path. The search is in this order.,We can import the definitions inside a module to another module or the interactive interpreter in Python.,We can import a module using the import statement and access the definitions inside it using the dot operator as described above. Here is an example.

Let us create a module. Type the following and save it as example.py.

# Python Module example

def add(a, b):
   ""
"This program adds two
numbers and
return the result ""
"

result = a + b
return result

We use the import keyword to do this. To import our previously defined module example, we type the following in the Python prompt.

>>>
import example

Using the module name we can access the function using the dot . operator. For example:

>>> example.add(4, 5.5)
9.5

When you run the program, the output will be:

The value of pi is 3.141592653589793

We can import a module by renaming it as follows:

#
import module by renaming it

import math as m
print("The value of pi is", m.pi)

Suggestion : 4

We highly recommend following the Pytorch Github page to set up the Python development environment on your local machine.,To track the latest updates for iOS, you can build the PyTorch iOS libraries from the source code.,Make sure you have cmake and Python installed correctly on your local machine. We recommend following the Pytorch Github page to set up the Python development environment,A comprehensive step-by-step tutorial on how to prepare and run the PyTorch DeepLabV3 image segmentation model on iOS.

pip install torchvision
python trace_model.py
pod install
let image = UIImage(named: "image.jpg") !
   imageView.image = image
let resizedImage = image.resized(to: CGSize(width: 224, height: 224))
guard
var pixelBuffer = resizedImage.normalized()
else {
   return
}
var normalizedBuffer: [Float32] = [Float32](repeating: 0, count: w * h * 3)
// normalize the pixel buffer
// see https://pytorch.org/hub/pytorch_vision_resnet/ for more detail
for i in 0. . < w * h {
   normalizedBuffer[i] = (Float32(rawBytes[i * 4 + 0]) / 255.0 - 0.485) / 0.229 // R
   normalizedBuffer[w * h + i] = (Float32(rawBytes[i * 4 + 1]) / 255.0 - 0.456) / 0.224 // G
   normalizedBuffer[w * h * 2 + i] = (Float32(rawBytes[i * 4 + 2]) / 255.0 - 0.406) / 0.225 // B
}
private lazy
var module: TorchModule = {
   if let filePath = Bundle.main.path(forResource: "model", ofType: "pt"),
      let module = TorchModule(fileAtPath: filePath) {
         return module
      } else {
         fatalError("Can't find the model file!")
      }
}()