Python - os.system调用中的相对路径

时间:2016-02-28 06:36:08

标签: python

我正在构建一个自动执行sysadmin类型任务的python实用程序。该工具的一部分涉及编写脚本,然后使用python接口中的powershell调用它们。这种代码的一个例子是:

def remote_ps_session():
  target = raw_input("Enter your target hostname: ")
  print "Creating target.ps1 file to establish connection"
  pstarget = open("pstarget.ps1", "w")
  pstarget.write("$target = New-Pssession " + target + "\n")
  pstarget.write("Enter-PSSession $target" + "\n")
  pstarget.close()
  print "File created. Initiating Connection to remote host..."
  os.system("powershell -noexit -ExecutionPolicy Unrestricted " + "C:\path\to\my\file\pstarget.ps1")

我想做两件事,我认为可以用同样的方法回答,我还没找出什么是最好的(导入vs变量与初始设置定义等等)

为简单起见,我们说实用程序位于C:\ utility中,powershell函数位于更深层次的函数文件夹中:C:\ utility \ functions

我希望能够指定1)的位置,其中脚本(写入的文件)被保存到,然后2)在进行os.system调用时引用该位置。我希望它能够在大多数/任何现代Windows系统上运行。

我对可能性的看法是:

  1. 当脚本启动时获取当前目录并将其保存为变量,如果我需要返回目录,请取出该变量并删除最后一个后面的所有内容,依此类推。看起来不太理想。
  2. 首次启动文件提示,以便系统位置放入变量。例如,它会提示您在哪里想要您的日志文件?' '你想要输出文件在哪里?' '您希望在哪里生成脚本?'然后可以将这些变量称为变量,但如果它们移动了文件夹就会中断,并且可能不容易修复'为用户。
  3. 我想有一些方法可以引用当前目录并导航到.. \ parallel文件夹到我执行的位置。 .... \ 2文件夹,但这似乎也可能是凌乱的。我还没有看到管理这个的标准/最佳做法是什么。
  4. 编辑:基于一些评论,我认为__file__可能是开始寻找的地方。我将深入研究这个问题,但任何一些例子(例如:__file__/subfoldername或其他任何用法都会很酷。

1 个答案:

答案 0 :(得分:1)

Python有一个专门用于路径操作的库os.path,所以当你需要文件系统路径操作时,请查看它。

关于您的特定问题,请运行以下示例,以了解如何使用此lib中的函数:

test.py

import os
# These two should basicly be the same,
# but `realpath` resolves symlinks
this_file_absolute_path = os.path.abspath(__file__)
this_file_absolute_path1 = os.path.realpath(__file__)
print(this_file_absolute_path)
print(this_file_absolute_path1)
this_files_directory_absolute_path = os.path.dirname(this_file_absolute_path)
print(this_files_directory_absolute_path)
other_script_file_relative_path = "functions/some.ps"
print(other_script_file_relative_path)
other_script_file_absolute_path = os.path.join(this_files_directory_absolute_path,
                                               other_script_file_relative_path)
print(other_script_file_absolute_path)
print("powershell -noexit -ExecutionPolicy Unrestricted %s" %
      other_script_file_absolute_path)

你应该得到与此类似的输出:

/proj/test_folder/test.py
/home/user/projects/test_folder/test.py
/proj/test_folder
functions/some.ps
/proj/test_folder/functions/some.ps
powershell -noexit -ExecutionPolicy Unrestricted /proj/test_folder/functions/some.ps