2009-11-09 2 views
1

Я хотел бы скомпилировать и распространять (на .net) некоторые программы python, которые хорошо работают с IronPython, но я новичок в .net и получаю ошибки, связанные с конкретными модулями python. Существует утилита для компиляции на низкий уровень .net, и она работает хорошо, но я получаю ошибки при работе с общими библиотеками; код, который запускается в интерпретаторе, не обязательно компилируется. Например, ниже используются базовые модули shutil, getpass и os. getpass.getuser() возвращает имя пользователя в виде строки. shutil обеспечивает, помимо прочего, функцию копирования (хотя я могу переписать ее на чистом питоне и получить возможность компиляции), а os используется здесь для получения информации о папке, создания файлов и разворачивания файлов. Как я могу адаптировать материал по следующим строкам, в целом или любой части, чтобы использовать только библиотеки, родные для .net? Если кто-то использовал IronPython в качестве моста от python до обучения .net, любые связанные с этим советы заслуживают одобрения.C# или другие .net-эквиваленты базовых модулей python для IronPython?

import shutil 
import os 
import getpass 

uname = getpass.getuser() 

folders = ["https://stackoverflow.com/users/"+uname+"/location", "https://stackoverflow.com/users/"+uname+"/other_location"] 

for folder in folders: 
    for root, dir, files in os.walk(folder): 
     for file in files: 
      file_name = os.path.join(root, file) 
      time_stamp = os.stat(file_name).st_mtime 
      time_dict[time_stamp] = file_name 
      working_list.append(time_stamp) 


def sync_up(): 
    for item in working_list: 
     if item not in update_list: 
      os.remove(item) 
     else: 
      shutil.copy2(item, some_other_folder) 

def cp_function(target=some_folder): 
    if os.path.exists(target): 
     sync_up() 
    else: 
     try: 
      os.mkdir(target) 
      sync_up() 
     except: 
      print """error connecting 
      """ 

ответ

2

В osshutil) замены в .NET находятся в System.IO namespace.

Пространство имен System.IO содержит типы, которые позволяют читать и записывать файлы и потоки данных, а также типы, которые обеспечивают базовую поддержку файлов и каталогов.

Для большинства операций с файловым файлом попробуйте методы System.IO.File class. Справочная информация доступна через System.IO.Directory class.

Я не знаю альтернативу os.walk, попробуйте использовать методы GetDirectories и GetFiles для создания собственного хоста каталогов. Существует пример RecursiveFileProcessor в Directory.GetDirectories(String) doc.

Простой способ получить имя пользователя, которое в настоящее время вошло в систему, может быть System.Environment.UserName.

Простой интерактивный IronPython пример:

>>> import clr 
>>> from System import Environment 
>>> Environment.UserName 
'gimel' 
>>> from System import IO 
>>> IO.Directory.GetCreationTimeUtc('c:/') 
<System.DateTime object at 0x000000000000002B [02/07/2006 12:53:25]> 
>>> IO.Directory.GetLastWriteTimeUtc('c:/') 
<System.DateTime object at 0x000000000000002C [09/11/2009 08:15:32]> 
>>> IO.Directory.GetDirectories('C:/').Count 
24 
>>> help(IO.File.Copy) 
Help on built-in function Copy: 

Copy(...) 
    Copy(str sourceFileName, str destFileName, bool overwrite) 

     Copies an existing file to a new file. 
     Overwriting a file of the same name is allowed. 
... 
0

Для os модуля вы можете использовать модуль nt, который обеспечивает некоторые из тех же функций, в том числе osstat, remove и mkdir. (Это также включает в себя другие, как environ, getcwd, chdir и popen.)

Например:

» import nt 
» nt.getcwd() 
'C:\\Program Files\\Microsoft Visual Studio 10.0\\Common7\\IDE' 

Однако реализация является неполной, так как, к сожалению, она не имеет path или walk. Для них вам может понадобиться использовать NET System.IO как gimel suggests.

Смежные вопросы