Вы можете получить доступ к внешней SD-карте с помощью getExternalStorageDirectory () и предоставить разрешение на запрос для Manifest.permission.WRITE_EXTERNAL_STORAGE
В качестве альтернативы вы можете использовать StorageManager.getStorageVolumes () , чтобы узнать, какие доступные тома доступны на устройстве. Он вернет информацию о StorageVolume , таком как SD-карта и USB.
Примечание: он доступен из API 24.
С помощью этого вы можете получить доступ к пути к файлу, который вам нужен.
упомянутый комментатор exec
; это то, как вы бы соединили это:
def string_to_class(python_text):
local_vars = {}
exec(python_text, {}, local_vars)
# assume just a single new symbol was created (the class), and return it
return list(local_vars.values())[0]
class_template = """
class MyClass(object):
def __init__(self, name):
self.name = name
def print_name(self):
print('My name is: ' + self.name)
@staticmethod
def add_whatever(a, b):
return a + b
"""
MyClass = string_to_class(class_template)
my_class_instance = MyClass('Ben')
print(MyClass.add_whatever(2, 3))
my_class_instance.print_name()
Но, как и некоторые другие упомянутые комментаторы, это не распространенный метод, поэтому будьте осторожны с ним. Вы также столкнетесь с проблемами довольно быстро, поскольку ваш вариант использования усложняется:
some_string_that_defines_a_base_class = "case Base..."
some_string_that_defines_a_derived_class = "case Derived(Base):..."
Base = string_to_class(some_string_that_defines_a_base_class)
# this will crash because Base isn't defined in the scope that the string
# is being evaluated with
Derived = string_to_class(some_string_that_defines_a_derived_class)
Вы можете исправить это с помощью прямого вызова exec
(функция string_to_class
просто не достаточно мощный), но он быстро становится очень сложным в использовании: я даже не упомянул, как import
будет работать. Существуют и другие приемы (декораторы функций, метаклассы), которые могут позволить вам делать то, что вы хотите сделать, и при этом требовать меньше усилий, но иногда exec
действительно является вашим единственным вариантом.